You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于栈的CLRS风格带父节点与时间戳的DFS非递归实现探讨

关于CLRS习题22.3-7的非递归DFS实现探讨

Cormen、Leiserson、Rivest和Stein所著的《算法导论》(CLRS)第22.3节给出了递归版深度优先搜索(DFS)实现。该实现为每个节点u添加了父节点属性u.parent,以及分别表示首次访问时间的u.d和完成处理时间的u.f时间戳,算法时间复杂度为O(|V| + |E|)。

其伪代码如下:

DFS(G)
    for each vertex u in G.V
        u.color = WHITE
        u.parent = NIL
    time = 0
    for each vertex u in G.V
        if u.color == WHITE
            DFS-VISIT(G, u)

DFS-VISIT(G, u)
    time = time + 1
    u.d = time
    u.color = GRAY
    for each v in G.Adj[u]
        if v.color == WHITE
            v.parent = u
            DFS-VISIT(G, v)
    u.color = BLACK
    time = time + 1
    u.f = time

(注:修正了原伪代码中的两处笔误:ui.color改为u.color,vertext改为vertex)

习题22.3-7要求设计一个基于栈的非递归DFS算法。我最初采用类似walkccc给出的方案,但该方案的*O(|V| + |E|)时间复杂度存在争议;其他声称达到O(|V| + |E|)*复杂度的方案,要么无法生成符合要求的深度优先树(父节点设置不符合规则),要么存在v.f时间戳设置过早的问题。

我尝试通过字典栈记录节点的下一个未访问邻居的方式,优化了walkccc的方案,使其满足时间复杂度要求,但仍希望找到更简洁的实现方案,特此探讨CLRS可能期望的解法。

内容的提问来源于stack exchange,提问作者tarski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:57:05