一、通用的深度优先搜索
通用的深度优先搜索
- 通用的深度优先搜索在图上进行尽量深的搜索,连接尽量多的顶点,必要时可以进行分支(创建了树)。有时候深度优先搜索会创建多棵树,称为深度优先森林
- 深度优先搜索同样要用到顶点的前驱”属性,来构建树或森林。另外要设置发现时间和结束时间属性,前者是在第几步访问到这个顶点(设置灰色),后者是在第几步完成了此顶点探索(设置黑色)
- 顶点类Vertex,增加了属性discovery和finish;带有DFS算法的图类DFSGraph继承图类Graph,增加了属性time
更新后的顶点类Vertex
class Vertex:
"""顶点类"""
def __init__(
self, key, distance=0, pred=None, color="white", discovery=None, finish=None
):
self.key = key
self.connected_to = {}
self.distance = distance
self.pred = pred
self.color = color
self.discovery = discovery
self.finish = finish
def __str__(self):
return f"{self.key} connected to : {[x.key for x in self.connected_to]}"
def add_neighbor(self, nbr, weight=0):
"""加入边(即对端的顶点):键为nbr顶点类的实例,值为权重"""
self.connected_to[nbr] = weight
def get_connections(self) -> "list[Vertex]":
return self.connected_to.keys()
def get_key(self):
return self.key
def get_weight(self, nbr):
return self.connected_to.get(nbr, None)
def set_distance(self, distance):
self.distance = distance
def get_distance(self):
return self.distance
def set_pred(self, pred):
self.pred = pred
def get_pred(self):
return self.pred
def set_color(self, color):
self.color = color
def get_color(self):
return self.color
二、通用的深度优先搜索-实现
class DFSGraph(Graph):
def __init__(self):
super().__init__()
self.time = 0
def dfs(self):
# 初始化顶点颜色和前驱
for v in self:
v.set_color("white")
v.set_pred(-1)
# 遍历未访问的顶点
for v in self:
if v.get_color() == "white":
self.dfsvisit(v)
def dfsvisit(self, start_v: Vertex):
start_v.set_color("gray")
self.time += 1
# 记录第几步访问到这个顶点
start_v.discovery = self.time
for next_v in start_v.get_connections():
# 递归访问未访问的顶点并记录前驱
if next_v.get_color() == "white":
next_v.set_pred(start_v)
self.dfsvisit(next_v)
start_v.set_color("black")
self.time += 1
# 记录在第几步完成了此顶点探索
start_v.finish = self.time
通用的深度优先搜索算法-示例
dfs_g = DFSGraph()
dfs_g.add_edge("A", "B")
dfs_g.add_edge("A", "D")
dfs_g.add_edge("B", "C")
dfs_g.add_edge("B", "D")
dfs_g.add_edge("D", "E")
dfs_g.add_edge("E", "B")
dfs_g.add_edge("E", "F")
dfs_g.add_edge("F", "C")
for i in dfs_g.vertexes.values():
print(i)
dfs_g.dfs()
print("深度优先搜索算法构建的树:")
for k, v in dfs_g.vertexes.items():
print(k, f"{v.discovery}/{v.finish}")
### 输出结果
A connected to : ['B', 'D']
B connected to : ['C', 'D']
D connected to : ['E']
C connected to : []
E connected to : ['B', 'F']
F connected to : ['C']
深度优先搜索算法构建的树:
A 1/12
B 2/11
D 5/10
C 3/4
E 6/9
F 7/8
三、通用的深度优先搜索-算法分析
- 广度优先搜索算法包括dfs函数和dfsvisit函数。在dfs函数中,两次遍历所有顶点,所以是O(|V|)。在dfsvisit函数中,遍历所有边一次,所以是O(|E|)。综合起来DFS的时间复杂度为O(|V|+|E|),与BFS一样。
您正在阅读的是《数据结构与算法Python版》专栏!关注不迷路~