数据结构与算法Python版 通用的深度优先搜索


一、通用的深度优先搜索

通用的深度优先搜索

  • 通用的深度优先搜索在图上进行尽量深的搜索,连接尽量多的顶点,必要时可以进行分支(创建了树)。有时候深度优先搜索会创建多棵树,称为深度优先森林
  • 深度优先搜索同样要用到顶点的前驱”属性,来构建树或森林。另外要设置发现时间和结束时间属性,前者是在第几步访问到这个顶点(设置灰色),后者是在第几步完成了此顶点探索(设置黑色)
  • 顶点类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版》专栏!关注不迷路~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值