首页 > 编程语言 > 详细

算法——广度优先搜索

时间:2019-05-25 21:03:00      阅读:111      评论:0      收藏:0      [点我收藏+]

广度优先搜索

算法——广度优先搜索

广度优先搜索(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()

 

算法——广度优先搜索

原文:https://www.cnblogs.com/noonjuan/p/10923826.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!