代码改变世界

最短路径问题与广度优先搜索

2019-08-18 22:54  DataBases  阅读(2860)  评论(0编辑  收藏  举报

解决最短路径问题的算法被称为广度优先(breadth-first search,BFS)搜索。

广度优先搜索是一种用于图的查找算法,可解决两类问题:

从节点A出发,有前往节点B的路径吗?

从节点A出发,前往节点B的哪条路径最短?

最短路径问题的解决步骤:

1.使用图建立问题模型;

图用于模拟不同的东西是如何相连的。

2.使用广度优先搜索解决问题。

广度优先搜素算法从邻居节点及邻近节点的邻居节点中搜索,直到搜索到目标。

首先搜索一度 关系,再搜索二度关系 ,然后三度关系,......

因此,广度优先搜索不仅查到从A到B的路径,而且找到的是最短的路径。

只有按添加顺序查找时,才能实现这样的目的;可以使用队列(queue)来实现。

队列工作原理:先进先出(First In First Out,FIFO)。

队列操作:入队,出队。

图的实现:

图由一系列的节点和边组成;每个节点都与邻近节点相连,可以使用散列表来实现图。

散列表是无序的,添加键-值对的顺序是无关的。

1.图的表示(每个节点都与邻近节点 相连,散列表)

2.算法实现

from collections import deque
graph = {}
graph["you"] = {"alice", "bob", "claire"}
# 一度关系
graph["alice"] = ["peggy"]
graph["bob"] = ["anuj", "peggy"]
graph["claire"] = ["thom","jonny"]
# 二度关系
graph["peggy"] = []
graph["anuj"] = []
graph["thom"] = []
graph["jonny"] = []


# 判断name是否以m结尾
def person_is_seller(name):
return name[-1] == 'm'


# breadth-first-search(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("%s is a seller" %(person))
else:
search_queue += graph[person] # 不是,将邻近加入到搜索队列
searched.append(person) # 加入到已经搜索过的列表
return False


if __name__ == '__main__':
search("you")