广度优先搜索Python实例及注释

广度优先搜素Python实例及注释

本文是整理《算法图解》所得,挺有趣的一本书,通俗易懂。

例子:你是一个种橘子的,而你要在你的朋友或朋友的朋友中找到橘子商人,从而把橘子卖出去。

概念:你和你的朋友是一度关系,也就是靠近你的第一层关系,关系较近。你的朋友的朋友是你的二度关系。

广度优先搜索:在本例子中就是先在一度关系中找橘子商人,找到就结束,如果一度关系没找到就在二度关系中找。

广度优先搜索Python实例及注释_第1张图片

朋友关系图

在本示例python代码中用字典表示图中的关系,具体代码及注释如下:

#Author:Anthony
from collections import deque#collections 模块提供了一些有用的集合类
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']=[]
#print(graph)

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()#对队列中的第一项进行判断,出队
        if person not in searched:#仅当这个人没被检查过时才检查
            if person_is_seller(person):#如果person是商人就打印
                print(person+' is a mango seller!')
            else:#如果person不是商人,就将person的朋友都加入搜索队列
                search_queue+=graph[person]
                searched.append(person)#将这个人标记为检查过

search('you')

你可能感兴趣的:(算法,PYTHON,算法,python)