算法笔记6----广度优先搜索

本章内容:学习使用新的数据结构图来建立网络模型

                学习广度优先搜索

                学习有向图和无向图

                学习拓扑排序,这种排序算法指出了节点之间的依赖关系

广度优先算法是一种图算法,能让你找出两样东西之间的最短距离。解决最短路径问题的算法被称为广度优先搜索。

6.2图是什么

图用于模拟不同的东西是如何相连的。

6.3广度优先搜索

6.3.1查找最短路径

广度优先搜索可回答两种问题

第一类问题:从节点A出发,有前往节点B的路径吗?

第二类问题:从节点A出发,前往节点B的最短路径是哪条?

一度关系通常胜过二度关系,二度关系胜过三度关系,以此类推。因此,因先在一度关系中搜索,确定没有想要的值后,才在二度关系里面搜索。这就是广度优先搜索的工作原理。在广度优先搜索的执行过程中,搜索范围从起点开始逐渐向外延伸。

广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。不过只有按照添加顺序进行查找时,才能实现这种目的,可以使用队列这种数据结构。

6.3.2队列

队列只支持两种操作:入队和出队。

队列是一种先进先出FIFO的数据结构,而栈是一种后进后出LIFO的数据结构。

6.4实现图

graph = {}
graph['you'] = ['alice', 'bob', 'claire']
graph['bob'] = ['anuj', 'peggy']
graph['alice'] = ['peggy']
graph['claire'] = ['thoh', 'jonny']
graph['anuj'] = []
graph['peggy'] = []
graph['jonny'] = []
graph['thoh'] = []

关系单项的称为有向图,无向图没有箭头,直接相连的节点互为邻居。

6.5实现算法

 
 
#-*- coding:utf-8 -*-
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 person_is_seller(name):#判断是否是个芒果商,用名字的m判断,是为了实现代码
    return name[-1] == 'm'
def search(name):
    search_queue = deque()
    search_queue += graph[name]
    searched = []
    while search_queue:#列表不为空
        person = search_queue.popleft()#popleft返回队列左边的第一个
        if person_is_seller(person):#进行判断,用定义的函数
            print(person + " is a mango seller!")
        else:
            search_queue += graph[person]#不是的话继续递归
            searched.append(person)

if __name__ == '__main__':
    search('you')    

检查完一个人后,应将其标为已检查,且不再检查他,以免进入无限循环。

运行时间

如果在整个人际关系网中搜索,就意味着将沿每条边前行,因此运行时间至少O(边数).

有关运行时间:因为要搜索每一个人,因此每条边都要走过即O(边数),同时,还要对于每一个人要检查,将这个人添加到队列需要时间O(1),因为要对每一个人则是O(人数)。

所以,广度优先搜索的运行时间为O(人数 + 边数),这通常写作O(V + E),其中V为顶点(vertice)数,E为边数。

6.6小结

广度优先搜索指出是否有从A到B的路径。

如果有,广度优先搜索将找出最短路径。

面临类似于寻找最短路径的问题时,可尝试使用图来建立模型,再使用广度优先搜索来解决问题。

有向图中的边为箭头,箭头的方向指定了关系的方向。

无向图中的边不带箭头,其中关系是双向的。

队列是先进先出的。

栈是先进后出的。

你需要按加入顺序检查搜索列表的人,否则找到的就不是最短路径,因此搜索队列必须是队列。

对于检查过的人,务必不要再去检查,否则可能导致无限循环。

猜你喜欢

转载自blog.csdn.net/qq_41805514/article/details/80313720