学习编程知识的同时,梳理知识,也便于以后查找
tags: 图解算法、B站视频
图
图由结点
和边
组成。
与结点直接相连的结点称为邻居
。不直接相连的不是。
- 有向图
结点之间箭头了解的图。其中关系是单向的。
A->B
, A有邻居,B没有。 - 无向图
没有箭头,直接相连的节点互为邻居。
实现图
图由多个结点组成。每个结点都与临近结点相连。
可以使用散列表
表示这种关系。
graph = {}
graph["you"] = ["a","b","c"]
拓扑学排序
注: 拓(tuò)
示例
从某种程度上,这种列表是有序的。
如果A依赖于B,在列表中A就必须在B后面。这被称为拓扑学
。使用它可根据图创建一个有序列表。
最短路径问题
找出图中最短路径。解决最短路径问题的算法被称为广度优先算法。
树
树是一种特殊的图。其中没有往后指的边。
广度优先算法
是一种用于图的查找算法。
广度优先搜索可回答两类问题
- 一、从结点A出发,有前往结点B的路径吗?
- 二、从结点A出发,前往结点B的那条路径最短?
示例
将人际关系视为图,你的朋友是一度关系、朋友的朋友是二度关系。
执行过程
广度优先搜索的执行过程中,搜索范围从起点开始逐渐向外延伸,既先检查一度关系,再检查二度关系。
广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。
注: 只有按添加顺序查找时,才能实现这样的目的。实现这种目的的数据结构可以用
队列
。
避免死循环
检查一个结点之后,应将其标记为已检查,且不再检查他。
如果A是B和C的朋友,就会被检查两次。如果A是B的朋友,B是A的朋友,就会造成死循环。
可以用一个列表来记录检查过的人。
def search(name):
search_queue = deque()
search_queue += graph[name]
# 记录检查过的
searched = []
while search_queue:
person = search_queue.popleft()
if not person 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
# 实现图
graph = {}
graph["you"] = ["a","b","c"]
search("you")
运行时间
将沿着每条边前进(边是从一个结点到另一个结点的箭头或连接),因此运行时间至少为O(边数)。
还使用了一个队列,其中包含要检查的每个结点。添加每个结点时间都是O(1),因此对每个节点这样操作需要的总时间为O(结点数)
广度优先搜索的运行时间为O(结点数+边数)
,通常写作O(V+E)
,V为顶点数,E为边数。
–END—