今天看的《算法图解》广度优先算法,对一些相关内容做了一些整理。
目录
一、广度优先算法
假设你经营着一个芒果农场,需要寻找芒果销售商,以便将芒果卖给他。在Facebook,你与芒果销售商有联系吗?为此,你可在朋友中查找。
假设你没有朋友是销售商,那么你必须在朋友的朋友中查找。
这样一来,你不仅在朋友中查找,还在朋友的朋友中查找。别忘了,你的目标是在你的人际关系网中找到一位芒果销售商。因此,如果Alice不是芒果销售商,就将其朋友也加入到名单中。这意味着你将在她的朋友、朋友的朋友等中查找。使用这种算法将搜遍你的整个人际关系网,直到找到芒果销售商。这就是广度优先搜索算法。
1、实现 图:
首先,需要使用代码来实现图。图由多个节点组成。
每个节点都与邻近节点相连,如果表示类似于 “你→Bob” 这样的关系呢?好在你知道的一种结构让你能够表示这种关
系,它就是散列表!
记住,散列表让你能够将键映射到值。在这里,你要将节
点映射到其所有邻居。
2、实现算法:
3、代码实现:
# 散列表定义
graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["jonny"] = []
graph["thom"] = []
def person_is_seller(name): # 函数person_is_seller,判断一个人是不是芒果销售商
return name[-1] == 'm'
# 创建一个队列
from collections import deque
search_queue = deque() # 创建一个(搜索)队列
search_queue += graph["you"] #将你的邻居都加到这个搜索队列中
# graph["you"]是一个数组,其中包含你的所有的邻居,如["alice", "bob", "claire"]。
while search_queue:
person = search_queue.popleft()
if person_is_seller(person):
print(person + " is a mango seller!")
break
else:
search_queue += graph[person]
这个函数检查人的姓名是否以m结尾:如果是,他就是芒果销售商。这种判断方法有点搞笑,但就这个示例而言是可行的。
4、代码优化:
检查一个人之前,要确认之前没检查过他,这很重要。为此,你可使用一个列表来记录检查过的人。
考虑到这一点后,广度优先搜索的最终代码如下。
# 散列表定义
graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["jonny"] = []
graph["thom"] = []
# 创建一个队列
from collections import deque
# search_queue = deque() # 创建一个(搜索)队列
# search_queue += graph["you"] #将你的邻居都加到这个搜索队列中
# # graph["you"]是一个数组,其中包含你的所有的邻居,如["alice", "bob", "claire"]。
def person_is_seller(name): # 函数person_is_seller,判断一个人是不是芒果销售商
return name[-1] == 'm'
# if __name__=="__main__":
def BFS_search(name):
search_queue = deque() # 创建一个(搜索)队列
search_queue += graph[name] #将name的邻居都加到这个搜索队列中
searched =[] # 这个数组用于记录检查过的人
while search_queue:
person = search_queue.popleft()
if person not 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
BFS_search("you")