概述:本文将简述图的相关概念以及利用广度优先算法解决最短路径的思路。
解决最短路径问题的算法被称为广度优先搜索。
要确定如何从双子峰前往金门大桥,需要两个步骤。
(1) 使用图来建立问题模型。
(2) 使用广度优先搜索解决问题。
ͼ
图由节点和边组成。图用于模拟不同的东西是如何连接的。
广度优先搜索
广度优先搜索是一种用于图的查找算法,可帮助回答两类问题。
在广度优先搜索的执行过程中,搜索范围从起点开始逐渐向外延伸,即先检查一度关系,再检查二度关系。
因此,你需要按添加顺序进行检查。有一个可实现这种目的的数据结构,那就是队列(queue)。
队列是一种先进先出(First In First Out, FIFO)的数据结构,而栈是一种后进先出(Last In First Out, LIFO)的数据结构。
用算法实现图
记住,散列表让你能够将键映射到值。在这里,你要将节点映射到其所有邻居。
graph={} graph["you"]=["alice", "bob", "claire"]
注意,“你”被映射到了一个数组,因此graph[“you”]是一个数组,其中包含了“你”的所有邻居。图被抽象成了一个散列表。
有向图(directed graph),其中的关系是单向的。无向图(undirected graph)没有箭头,直接相连的节点互为邻居。
下面用算法找到下面图中,从你到某个名
from collections import deque #将图抽象成散列表 graph = {} #将你映射到一个数组,数组中包含了你的所有邻居 graph["you"] = ["alice","bob","claire"] #依次按层级将其他节点和其邻居映射到散列表 graph["bob"] = ["anuj","peggy"] graph["alice"] = ["peggy"] graph["claire"] = ["thom","jonny"] graph["peggy"] = [] graph["anuj"] = [] graph["thom"] = [] graph["jonny"] =[] def person_is_seller(name): return name[-1] == 'm' #假设我们要查找你的邻居中是否有姓名是m结尾的人(类似查找从是否有从A-B的路径)。下面是实现过程。 #增加一个数组用来记录已经检查过的人,防止重复检查和死循环 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 a seller") return True else: search_queue += graph[person] searched.append(person) return False search("you") search("alice")
广度优先搜索的运行时间为O(人数+边数),这通常写作O(V+E),其中V为顶点(vertice)数,E为边数。
拓扑排序:
如果任务A依赖于任务B,在列表中任务A就必须在任务B后面。这被称为拓扑排序。
树是一种特殊的图,其中没有往后指的边。
来源:51CTO
作者:不能如期而至
链接:https://blog.csdn.net/gexiaoyizhimei/article/details/100780572