通用的深度优先搜索
骑士周游问题是一种特殊的对图进行深度优先搜索
- 其目的是建立一个没有分支的最深的深度优先树,表现为一条线性的包含所有节点的退化树
一般的深度优先搜索目标是在图上进行尽量深的搜索,连接尽量多的顶点,必要时可以进行分支(创建了树)
- 有时候深度优先搜索会创建多棵树,称为"深度优先森林"
深度优先搜索同样要用到顶点的"前驱"属性,来构建树或森林
- 另外要设置“发现时间”和“结束时间”属性
- 前者是在第几步访问到这个顶点(设置灰色)
- 后者是在第几步完成了此顶点探索(设置黑色)
- 这两个属性对后面的图算法很重要
带有DFS算法的图实现为Graph的子类
- 顶点Vertex增加了成员Discovery及Finish,图Graph增加了成员time用于记录算法执行的步骤数目
- 代码实现
- BFS采用队列存储待访问顶点
- DFS通过递归调用,隐式使用了栈
from pythonds.graphs import Graph
class DFSGroup(Group):
def __init__(self):
super().__init__()
self.time = 0
def dfs(self):
for aVertex in self:
aVertex.setColor('white')
aVertex.setPred(-1)
for aVertex in self:
if aVertex.getColor() == 'white':
self.dfsvisit(aVertex)
def dfsvisit(self, startVertex):
startVertex.setColor('gray')
self.time += 1
startVertex.setDiscovery(self.time)
for nextVertex.getColor() == 'white':
nextVertex.setPred(startVertex)
self.dfsvisit(nextVertex)
startVertex.setColor('black')
算法分析
DFS构建的树,其大点的“发现时间”和“结束时间”属性,具有类似括号性质
- 即一个顶点的“发现时间”总小于所有子顶点的“发现时间”
- 而“结束时间”则大于所有子顶点“结束时间”,比子顶点更早被发现,更晚被结束搜索
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4e63b20bdeef8649249cf32dbece469d.png)
DFS运行时间同样也包括两个方面:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a9e687b1bbecdd02eb3485120f79eeba.png)