通用的深度优先搜索

通用的深度优先搜索

骑士周游问题是一种特殊的对图进行深度优先搜索

  • 其目的是建立一个没有分支的最深的深度优先树,表现为一条线性的包含所有节点的退化树

一般的深度优先搜索目标是在图上进行尽量深的搜索,连接尽量多的顶点,必要时可以进行分支(创建了树)

  • 有时候深度优先搜索会创建多棵树,称为"深度优先森林"

深度优先搜索同样要用到顶点的"前驱"属性,来构建树或森林

  • 另外要设置“发现时间”和“结束时间”属性
    • 前者是在第几步访问到这个顶点(设置灰色)
    • 后者是在第几步完成了此顶点探索(设置黑色)
  • 这两个属性对后面的图算法很重要

带有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构建的树,其大点的“发现时间”和“结束时间”属性,具有类似括号性质
  • 即一个顶点的“发现时间”总小于所有子顶点的“发现时间”
  • 而“结束时间”则大于所有子顶点“结束时间”,比子顶点更早被发现,更晚被结束搜索
    在这里插入图片描述
DFS运行时间同样也包括两个方面:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leopold·Lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值