陈银波的知识小站

  • 首页
  • 数学
  • 算法
  • 图
  • 数据
  • 记忆
复杂 = f (简单1, 简单2, ... , 简单n)
  1. 首页
  2. 图
  3. 正文

深度优先搜索中 visited 标记时机探索

30 6 月, 2024 1027点热度 0人点赞 4条评论

0 前言

如果你经常涉及到搜索算法,那么一般对 visited 有一定了解。如果你知道 visited 的作用,却不知道什么时候是正确的进行 visited 标记的时机,这篇文章会给你帮助。

1 visited 概念

在涉及到图或者其他一些结构的搜索时,常常会涉及到节点的重复访问问题,而这个时候,我们常常都会使用 visited 概念来对已经访问过的节点进行标记,从而避免在搜索过程中重复访问同一个节点,避免无限循环或效率降低。

接下来我将从递归和迭代两个场景展示深度优先搜索标记时机的不同(这里以图为例)。

2 递归场景下的 visited 标记时机

DFS(v)
  在 v 上打 visited 标记
  for u in v 的相邻节点
    if u 没有打过 visited 标记 then
      DFS(u)
    end
  end
end

以上是递归方式的深度优先搜索的标准实现方式,可以看到,在递归函数开始时,即在进入一个新节点前,立即将该节点标记为已访问,后续便不会再对标记过的节点进行递归调用。

3 迭代场景下的 visited

DFS(v)
  在 v 上打 visited 标记
  v 入栈
  while 栈不为空
    u 出栈
    for w in u 的相邻节点
      if w 没有打过 visited 标记 then
        在 w 上打 visited 标记
        w 入栈
      end
    end
  end
end

以上是迭代方式的深度优先搜索的标准实现方式,值得注意的点是,节点不是在出栈的时候打上 visited 标记,而是在入栈的时候打上 visited 标记,这是初学者很容易混淆的点。

作为对比我们可以看看,如果是在出栈的时候进行 visited 标记,伪代码如下:

DFS(v)
  v 入栈
  while 栈不为空
    u 出栈
    在 u 上打 visited 标记
    for w in u 的相邻节点
      if w 没有打过 visited 标记 then
        w 入栈
      end
    end
  end
end

上述两种方法都能够正确地完成深度优先搜索。

第一种方法,因为先标记再入栈,确保了不会有一个节点被多次压入栈中,从而避免了重复访问同一节点。

第二种方法,如果图中存在环,则有可能会有多次将同一个节点压入栈中的情况,但由于每次出栈时都会检查节点是否已被访问,因此虽然可能有多次入栈操作,但不会导致重复处理(即不会再次访问已经标记为 visited 的节点)。

所以,第二种方式相比第一种方式,会存在重复的入栈操作的额外开销。

4 小结

好了,文章这里就结束了,上述介绍了深度优先搜索在递归和迭代两种场景下的 visited 标记时机,简单总结就是,在标准的深度优先搜索中,递归开始时打 visited 标记,迭代入栈时打 visited 标记。

最后,给想要更深入了解 visited 标记时机的人留个小问题,迭代场景下,所有场景下都是入栈(入列)时打访问标记吗?

有兴趣的人可以了解下最短路径算法 Dijkstra 算法的优先队列实现(https://oi-wiki.org/graph/shortest-path/),去留意下 visited 的时机,相信你会对 visited 时机有更深的理解。

标签: 暂无
最后更新:1 7 月, 2024

陈银波

邮箱:agwave@foxmail.com 知乎:https://www.zhihu.com/people/agwave github:https://github.com/agwave leetcode:https://leetcode.cn/u/agwave

点赞
< 上一篇
下一篇 >

文章评论

  • Watch MMA Fights Online

    Spot on with this write-up, I actually suppose this web site needs way more consideration. I’ll in all probability be once more to read way more, thanks for that info.

    9 9 月, 2025
    回复
  • Watch All NFL games

    Hi there, just changed into alert to your weblog via Google, and found that it is truly informative. I’m gonna watch out for brussels. I’ll appreciate for those who proceed this in future. Lots of other people will be benefited out of your writing. Cheers!

    9 9 月, 2025
    回复
  • Live F1 Races Online

    Great post. I am facing a couple of these problems.

    9 9 月, 2025
    回复
  • gullybet betting odds

    Some truly interesting details you have written.Aided me a lot, just what I was looking for : D.

    11 9 月, 2025
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    回复 Live F1 Races Online 取消回复

    文章目录
    • 0 前言
    • 1 visited 概念
    • 2 递归场景下的 visited 标记时机
    • 3 迭代场景下的 visited
    • 4 小结
    分类
    • 图
    • 工程
    • 数学
    • 数据
    • 算法
    • 记忆
    最新 热点 随机
    最新 热点 随机
    你的重复性工作,我帮你自动化 “沙滩之城” Change Data Capture (CDC) 技术初探 IPv6在物联网中的应用 IPv6首部的改进:简化与优化网络通信
    IPv6首部的改进:简化与优化网络通信IPv6在物联网中的应用IPv6:下一代互联网协议Change Data Capture (CDC) 技术初探“沙滩之城”
    图数据分享:深圳地铁数据 一笔画问题揭秘:轻松掌握欧拉图与欧拉回路的奥秘 你的重复性工作,我帮你自动化 上帝最喜爱的公式:欧拉恒等式 深度优先搜索中 visited 标记时机探索
    归档
    • 2025 年 9 月
    • 2024 年 10 月
    • 2024 年 9 月
    • 2024 年 8 月
    • 2024 年 7 月
    • 2024 年 6 月
    • 2024 年 5 月

    COPYRIGHT © 2024 陈银波的知识小站. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    粤ICP备2024254302号-1

    粤公网安备44030002003798号