标签:python 示例 运行 highlight 箭头 rom 包含 无限循环 需要
解决最短路径问题的算法被称为广度优先搜索。
(1) 使用图来建立问题模型。
(2) 使用广度优先搜索解决问题。
图模拟一组连接。
图由节点(node)和边(edge)组成。一个节点可能与众多节点直接相连,这些节点被称为邻居。图用于模拟不同的东西是如何相连的。
广度优先搜索是一种用于图的查找算法,可帮助回答两类问题。
在广度优先搜索的执行过程中,搜索范围从起点开始逐渐向外延伸,即先检查一度关系,再检查二度关系。
广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。
需要按添加顺序进行检查。可以用队列来实现这种目的
队列类似于栈,不能随机地访问队列中的元素。
队列只支持两种操作:入队和出队。
队列是一种先进先出(First In First Out,FIFO)的数据结构,而栈是一种后进先出(Last InFirst Out,LIFO)的数据结构。
使用散列表将键映射到值,用来实现图
示例:
>>> graph={} >>> graph[‘you‘]=[‘alice‘,‘bob‘,‘claire‘] >>> graph {‘you‘: [‘alice‘, ‘bob‘, ‘claire‘]} >>> graph[‘bob‘]=[‘anuj‘,‘peggy‘] >>> graph[‘alice‘]=[‘peggy‘] >>> graph[‘claire‘]=[‘thom‘,‘jonny‘] >>> graph[‘anuj‘]=[] >>> graph[‘peggy‘]=[] >>> graph[‘thom‘]=[] >>> graph[‘jonny‘]=[] >>> graph {‘you‘: [‘alice‘, ‘bob‘, ‘claire‘], ‘bob‘: [‘anuj‘, ‘peggy‘], ‘alice‘: [‘peggy‘], ‘claire‘: [‘thom‘, ‘jonny‘], ‘anuj‘: [], ‘peggy‘: [], ‘thom‘: [], ‘jonny‘: []}
键—值对的添加顺序不重要,因为散列表是无序的。
其中的关系是单向的
没有箭头,直接相连的节点互为邻居
from collections import deque #使用函数deque来创建一个双端队列 graph={‘you‘: [‘alice‘, ‘bob‘, ‘claire‘], ‘bob‘: [‘anuj‘, ‘peggy‘], ‘alice‘: [‘peggy‘], ‘claire‘: [‘thom‘, ‘jonny‘], ‘anuj‘: [], ‘peggy‘: [], ‘thom‘: [], ‘jonny‘: []} def search(name): search_queue=deque() search_queue+=graph[name] searched=[] #这个列表用于记录检查过的元素 while search_queue: person=search_queue.popleft() if not person in searched: if person_is_seller(person): print(person,‘is a mango seller!‘) return True else: search_queue+=graph[person] searched.append(person) return False def person_is_seller(name): return name[-1]==‘m‘ search(‘you‘)
广度优先搜索的运行时间为O(V + E),其中V为顶点(vertice)数,E为边数。
解析:
在整个图中搜索元素,就意味着将沿每条边前行(记住,边是从一个人到另一个人的箭头或连接),因此运行时间至少为O(边数)。
还使用了一个队列,其中包含要检查的每个元素。将一元素添加到队列需要的时间是固定的,
即为O(1),因此对每个元素都这样做需要的总时间为O(元素个数)。
标签:python 示例 运行 highlight 箭头 rom 包含 无限循环 需要
原文地址:https://www.cnblogs.com/lilip/p/9541328.html