zoukankan      html  css  js  c++  java
  • 算法——广度优先搜索

    广度优先搜索

    算法——广度优先搜索

    广度优先搜索(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()
    Resistance is Futile!
  • 相关阅读:
    GUID
    ORA-04044: 此处不允许过程, 函数, 程序包或类型和
    去掉word文档两边的空白
    Mysql数据库服务启动
    计算两个日期之间的天数
    SpringMVC——接收请求参数和页面传参
    ajax中get和post区别
    如何实现两个页面之间进行传值
    面试题
    MySQL数据库优化
  • 原文地址:https://www.cnblogs.com/noonjuan/p/10923826.html
Copyright © 2011-2022 走看看