美文网首页
算法图解 (六)

算法图解 (六)

作者: EruDev | 来源:发表于2018-06-01 17:29 被阅读0次

    第六章 广度优先搜索

    广度优先搜索算法 (英文: Breadth-First-Search, 缩写为BFS), 又称宽度优先搜索, 或横向优先搜索, 是一种图形搜索算法。 简单的说, BFS 是从根节点开始, 沿着树的宽度遍历树的节点。 如果所有节点均被访问, 则算法终止。 广度优先搜索的实现是一般采用 open-closed 表

    [图片上传失败...(image-28dbd4-1527845362464)]

    书中列举了好几个例子来讲述什么是广度优先搜索, 讲的很容易理解的。

    芒果销售商问题。 目标是在你的人际关系网找到一位芒果销售商, 如果 A 不是芒果销售商, 就将他的朋友也加入到查找名单中。 也就意味着你将在他的朋友、 朋友的朋友等中查找。 使用这种算法将遍历你的整个人际关系网, 直到找到芒果销售商。 这就是广度优先搜索算法

    # coding: utf-8
    
    """
    这是书中芒果销售商问题
    名字中以`m`结尾的是销售商
    """
    from collections import deque
    
    graph = {}
    graph["you"] = ["alice", "bob", "claire"]
    graph["bob"] = ["anuj", "peggy"]
    graph["alice"] = ["peggy"]
    graph["claire"] = ["thom", "jonny"]
    graph["anuj"] = []
    graph["peggy"] = []
    graph["thom"] = []
    graph["jonny"] = []
    
    
    def search(name):
        search_deque = deque()
        search_deque += graph[name]
        searched = []
        while searched:
            person = search_deque.popleft()
            if person is not searched:
                if person_is_seller(person):
                    print('Person' + person + 'is a mango seller')
                    return True
                else:
                    search_deque += graph[person]
                    searched.append(person)
        return False
    
    def person_is_seller(name):
        return name[-1] == 'm'
    
    print(search('you'))
    

    队列

    队列是先进先出, 栈是先进后出

    小结

    • 广度优先搜索指出是否有从A到B的路径, 如果有广度优先搜索将找出最短路径
    • 对于寻找最短路径问题, 可使用图来建模, 再使用广度优先搜索来解决问题
    • 对于检查过的人, 不需要再去检查了, 否则可能导致无限循环

    相关文章

      网友评论

          本文标题:算法图解 (六)

          本文链接:https://www.haomeiwen.com/subject/wdpksftx.html