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!
  • 相关阅读:
    视图、触发器、事务、存储过程、函数,流程控制
    权限管理,pymysql模块
    单表查询
    sql逻辑查询语句的执行顺序
    Mysql数据库基础知识
    库,表,记录的相关操作
    并发编程之IO模型
    并发编程之协程
    并发编程之多线程
    事件委托
  • 原文地址:https://www.cnblogs.com/noonjuan/p/10923826.html
Copyright © 2011-2022 走看看