算法图解 (六)

第六章 广度优先搜索

广度优先搜索算法 (英文: 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的路径, 如果有广度优先搜索将找出最短路径
  • 对于寻找最短路径问题, 可使用图来建模, 再使用广度优先搜索来解决问题
  • 对于检查过的人, 不需要再去检查了, 否则可能导致无限循环

你可能感兴趣的:(算法图解 (六))