算法图解:广度优先搜索

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是边数。

以上是关于算法图解:广度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

算法图解:广度优先搜索

《算法图解》3

暴力美学2—BFS广度优先搜索(算法图解第二弹)

《图解算法》--快速排序哈希表图广度优先搜索算法

算法图解之广度优先搜索

算法图解5 - 图和广度优先搜索