算法图解:广度优先搜索
Posted CollectTime
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法图解:广度优先搜索相关的知识,希望对你有一定的参考价值。
介绍一下图中的广度优先算法。breadth-first search BFS.
BFS可以让你找到两样东西之间的最短距离,不过最短距离的定义有很多。
找出换乘最少的乘车路线:需要两个步骤。
1)使用图建立问题模型
2)使用广度优先搜索解决问题
广度优先搜索是一种用于图的查找算法,可以解决两类问题:
1)从节点A出发,前往节点B的路径
2)从节点A出发,前往节点B的最短路径。
这里主要针对第二类问题:查找最短路径
思路是按顺序依次检查名单所有人,看看是都是芒果销售商。浙江现在一度关系中查找,再在二度关系中查找。因此找到的是关系最近的芒果销售商。这里需要维护一个查找队列,队列具有先入先出的特点,这样可以保证先查找完一度关系之后再查找二度关系。
(队列是一种先进先出的数据结构,栈是一种后进先出的数据结构。)
算法流程:
1:创建图
2:创建一个队列,用于存储需要检查的人
3:从队列中弹出一个人
4:检查这个人是是否是芒果销售商
5:判断如果是则退出,否,则将这个人所有的邻居加入,并回到第3步
6:如果队列为空,则退出。
创建图使用字典(散列表方式)。
graph = {}
graph["you"] = ["bob",'claire','alice']
graph['bob'] = ['PEGGY','ANUJ']
graph['claire'] = ['THOM','JONNY']
graph['alice'] = ['PEGGY']
graph['PEGGY'] = []
graph['ANUJ'] = []
graph['THOM'] = []
graph['JONNY'] = []
创建队列方式:
from collections import deque
search_queue = deque()
队列中加入数据:
search_queue += graph[name]
队列中pop数据:
person = search_queue.popleft()
BFS搜索算法:
def search(name):
search_queue = deque()
search_queue += graph[name]
searched = []
while search_queue:
person = search_queue.popleft()
if person not in searched:
if(person_is_seller(person)):
print( person + " is the aim!")
return True
else:
search_queue += graph[person]
searched.append(person)
return False
其中很重要的一点是需要创建一个searched数组,该数组保存着所有已经被搜索后的人名,然后每次有新的数据需要检查的时候,首先判断是否再该数组中,如果再的话就不检查了,这样可以避免无限循环。
运行时间分析:
由于使用了队列,最坏的情况需要检查所有人,每个人添加到节点的时间固定为O(1),所以每个人需要的总时间为O(人数),.同时,如果需要在整个人际网中搜索销售商,意味着需要沿着每个边前行,所以时间为0(边数)。固总的时间为O(V+E),其中V是顶点数,E是边数。
以上是关于算法图解:广度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章