算法——广度优先搜索

广度优先搜索

算法——广度优先搜索

广度优先搜索(breath-first search, BFS):解决最短路径(shortest-path problem)的算法被称为广度优先搜索。

队列(queue):一种先进先出(First In First Out, FIFO)的数据结构,只支持入队和出队两种操作。

要点:
广度优先搜索指出是否有从A到B的路径
如果有,广度优先搜索将找出最短路径
面临类似于寻找最短路径的问题时,可尝试使用图来建立模型,再使用广度优先搜索来解决问题
队列是先进先出的(FIFO)
栈是后进先出的(LIFO)
需要按加入的顺序检查搜索列表中的人,否则找到的就不是最短路径,因此搜索列表必须是队列
对于检查过的元素,务必不要再去检查,否则可能导致无限循环

# breath_first_search.py  解决最短路劲问题(shortest-path problem)的广度优先搜索
from collections import deque


def person_is_seller(name):
    return name[-1] == 'm'  # 检查是否名字以m结尾


def search(name):
    search_queue = deque()  # 创建一个队列
    search_queue += graph[name]  # 将你的朋友都加入到这个搜索队列中
    searched = []  # 已经检查过的人
    while search_queue:  # 只要队列不为空
        person = search_queue.popleft()  # 取出一个人
        if person_is_seller(person):  # 如果这个人是我们要找的人
            print(person + ' is a mango seller!')
            return True
        else:
            searched.append(person)
            search_queue += graph[person]  # 如果不是,将这个人的朋友也加入到搜索队列中
    return False


def practice():  # 练习
    graph = {}
    graph['get up'] = ['exercise', 'brush teeth', 'pack lunch']
    graph['brush teeth'] = ['have breakfast']
    graph['exercise'] = ['take a shower']
    graph['take a shower'] = ['get dressed']
    graph['have breakfast'] = []
    graph['pack lunch'] = []
    graph['get dressed'] = []

    queue = deque()
    queue += graph['get up']
    done = []
    print('get up')

    while queue:
        do = queue.popleft()
        if do in done:
            pass
        else:
            print(do)
            queue += graph[do]
            done.append(do)


if __name__ == '__main__':
    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'] = []

    search('you')

    practice()

猜你喜欢

转载自www.cnblogs.com/noonjuan/p/10923826.html