6.1 图简介
6.2 图是什么
图由节点
和边
组成,一个节点可能与众多节点直接相连,这些节点被称为邻居。
6.3 广度优先搜索
广度优先搜索(breadth-first search,BFS)可用于解决两类问题:
- 从节点A出发,有前往节点B的路径吗?
- 从节点A出发,前往节点B的哪条路径最短?
6.3.1 查找最短路径
实现广度优先搜索的数据结构,称为队列(queue)。
6.3.2 队列
队列是一种先进先出
的数据结构,支持两种操作:入队和出队
。而栈是一种先进后出
的数据结构。
6.4 实现图
使用散列表
来实现图。散列表是无序的,添加键-值对的顺序无关紧要。
graph = {}
graph["you"] = ["alice","bob","claire"]
6.5 实现算法
在Python中,可使用函数deque
来创建一个双端队列
from collections import deque
search_queue = deque() ##创建一个队列
search_queue += graph["you"] ##入队
广度优先搜索的算法是:
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!")
else:
search_queue += graph[person]
searched.append(person)
return False
def person_is_seller(name):
return name[-1] == 'm'
广度优先搜索的运行时间复杂度为 O ( V + E ) O(V+E) O(V+E),其中 V V V为顶点数, E E E为边数。