为什么使用 DFS 而不是 BFS 来查找图中的循环

2024-01-31

DFS 主要用于查找图中的循环,而不是 BFS。有什么理由吗?两者都可以查找节点是否已经存在 遍历树/图时访问过。


深度优先搜索比广度优先搜索更节省内存,因为您可以更快地回溯。如果使用调用堆栈,实现起来也更容易,但这依赖于不会溢出堆栈的最长路径。

Also if your graph is directed http://en.wikipedia.org/wiki/Directed_graph then you have to not just remember if you have visited a node or not, but also how you got there. Otherwise you might think you have found a cycle but in reality all you have is two separate paths A->B but that doesn't mean there is a path B->A. For example,

如果你从0,它会检测到存在循环,但实际上不存在循环。

通过深度优先搜索,您可以在下降时将节点标记为已访问,并在回溯时取消标记。请参阅有关此算法的性能改进的评论。

For the 检测有向图中循环的最佳算法 https://stackoverflow.com/questions/261573/best-algorithm-for-detecting-cycles-in-a-directed-graph你可以看看塔里安算法 http://en.wikipedia.org/wiki/Tarjan%E2%80%99s_strongly_connected_components_algorithm.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用 DFS 而不是 BFS 来查找图中的循环 的相关文章

  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • 重写修改后的 goto 语义的算法

    我有一大堆使用旧的自行设计的脚本语言编写的遗留代码 我们将它们编译 翻译成 javascript 该语言有条件跳转 跳转到标签 与普通 goto 语句的区别在于 不可能向后跳转 该语言中没有嵌套的 if 语句或循环 由于 javascrip
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 如何光栅化旋转矩形(通过 setpixel 在 2d 中)

    我有四个 2d 顶点 A B C D 的旋转矩形 我需要在像素缓冲区中 有效地 光栅化 绘制它 使用 setpixel x y 颜色 怎么做 我正在尝试使用一些代码 例如 convertilg a b c d do up down left
  • 贝尔曼福特算法可以有任意的边顺序吗?

    我刚刚开始学习新算法 但当我阅读 极客为极客而写的贝尔曼福特算法 时 我陷入了困境 http www geeksforgeeks org dynamic programming set 23 bellman ford algorithm h
  • c# GDI边缘空白检测算法

    我正在寻找解决方案检测边缘空白c 位图 来自 c 托管 GDI 库 图像将是透明的 or white 大多数 400x 图片的尺寸为 8000x8000px 边缘周围有大约 2000px 的空白 找出边缘的最有效方法是什么 x y 高度和宽
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 删除近排序数组中未排序/离群元素

    给定一个像这样的数组 15 14 12 3 10 4 2 1 我如何确定哪些元素乱序并删除它们 在本例中为数字 3 我不想对列表进行排序 而是检测异常值并将其删除 另一个例子 13 12 4 9 8 6 7 3 2 我希望能够删除 4 和
  • 排序矩阵的选择算法

    这是谷歌面试问题 给定一个 N N 矩阵 所有行均已排序 所有列均已排序 找到矩阵的第 K 个最大元素 在 n 2 中执行它很简单 我们可以使用堆或合并排序 n lg n 对它进行排序 然后得到它 但是有没有更好的方法 比 n lg n 更
  • 用于查找最近邻居的空间划分算法如何工作?

    为了找到最近的邻居 空间分区 http en wikipedia org wiki Nearest neighbor search Space partitioning是算法之一 它是如何工作的 假设我有一组 2D 点 x 和 y 坐标 并
  • 你能用 C# 编写一个同样优雅的排列函数吗?

    我非常喜欢这个 6 行解决方案 并尝试在 C 中复制它 基本上 它会排列数组的元素 def permute xs pre if len xs 0 yield pre for i x in enumerate xs for y in perm
  • 寻找公共子集的算法

    I have N number of sets Si of Numbers each of a different size Let m1 m2 mn be the sizes of respective sets mi Si and M
  • 查找最接近点的多边形顶点的索引

    Heading 我需要找到最接近点的多边形的索引 所以在这种情况下 输出将是 4 和 0 这样 如果添加了红点 我就知 道将顶点放置在数组中的位置 有谁知道从哪里开始 抱歉 如果标题有误导性 我不知道如何正确表达它 In this case
  • 有向未加权图中的最长非循环路径

    什么算法可用于找到未加权有向无环图中的最长路径 动态规划 http en wikipedia org wiki Dynamic programming 它也被引用于最长路径问题 http en wikipedia org wiki Long
  • 最小化代表性整数的误差之和

    Given n integers between 0 10000 as D1 D2 Dn where there may be duplicates and n can be huge I want to find k distinct r
  • 确定一组日期的事件重复模式

    我正在寻找一种模式 算法或库 它将采用一组日期并在退出时返回重复的描述 即集合 11 01 2010 11 08 2010 11 15 2010 11 22 2010 11 29 2010 会产生类似 十一月的每个星期一 的结果 有没有人以
  • 如何在javascript中计算日出和日落?

    我正在使用appcelerator titan开发一个IOS应用程序 我想让我的应用程序在日出和日落时向用户发送本地通知 解决这个问题的一个好工具是使用 YQL 的雅虎天气 但是 雅虎天气仅供非商业用途 我正在尝试找到一个javascrip
  • 以最少插入次数将字符串转换为回文

    这是一个来自日常编码问题 https www dailycodingproblem com 给定一个字符串 找到可以通过插入来组成的回文数 单词中任何位置的字符数尽可能少 如果有 大于一个可以制作的最小长度的回文 返回 字典顺序最早的一个

随机推荐

  • 如何在基于 servlet 的 Web 应用程序中临时保存生成的文件

    我正在尝试生成一个 XML 文件并将其保存在 WEB INF pages 下面是我的代码 它使用相对路径 File folder new File src main webapp WEB INF pages StreamResult res
  • 使用 R Shiny 将(多个)值添加到数据框

    我将 R闪亮与 ggplot 结合使用来可视化某个数据集 我希望用户能够向该数据集添加值 我可以让我的应用程序向我显示原始数据 一个数据点 但是一旦用户输入一个新点 旧的数据点就消失了 用户输入的数据实际上并未存储在我的数据框中 我正在使用
  • Android WebView加载GoogleMap数据渲染

    我正在尝试使用以下函数在 WebView 中显示 div String baseUrl String mimeType text html String encoding UTF 8 html sb toString String hist
  • 有人可以向我解释“卫生”的概念吗(我是一名方案程序员)?

    所以 我是 r6rs 方案的新手 正在学习宏 谁能给我解释一下 卫生 是什么意思 提前致谢 卫生经常在宏的上下文中使用 卫生宏不使用可能会干扰正在扩展的代码的变量名称 这是一个例子 假设我们想要定义or带有宏的特殊形式 直观地说 or a
  • 通过 os.system 推送 [重复]

    这个问题在这里已经有答案了 我正在使用 crontab 为我的 Minecraft 服务器运行维护脚本 大多数时候它工作正常 除非 crontab 尝试使用重新启动脚本 如果我手动运行重新启动脚本 则不会有任何问题 因为我相信它与路径名有关
  • Android:在非 root 设备上运行脚本

    我可以在非 root 设备上运行二进制可执行文件或脚本 bash 文件吗 我有一个像这样的小脚本 helloworld sh echo hello world 我把它保存在 sdcard并尝试跑步 但我得到了 没有权限 我研究过 原因是执行
  • 将数组short转换为char的最快方法

    我每秒必须处理大约 2000 100 个元素数组 这些数组对我来说是短裤 其中的数据位于高位 需要移位并转换为字符 这是我能得到的最有效的方法 还是有更快的方法来执行此操作 我必须跳过其中 2 个值 for int i 0 i lt 48
  • 流式下载大文件,Python 请求中断

    我在 python requests v 2 0 1 中流式下载大文件 约 1 5 GB 时遇到问题 with open saved rar wb as file r session get url stream True timeout
  • “反向”统计:根据平均值和标准差生成数据

    拥有数据集并从中计算统计数据很容易 反过来又如何呢 假设我知道某个变量具有平均值 X 标准差 Y 并假设它具有正态 高斯 分布 生成适合分布的 随机 数据集 任意大小 的最佳方法是什么 编辑 这种发展自这个问题 https stackove
  • 使用 std::function 进行隐式转换[重复]

    这个问题在这里已经有答案了 可能的重复 为什么我的 C 编译器无法推导出 boost 函数的模板参数 https stackoverflow com questions 5871044 why cant my c compiler dedu
  • 如何使用 git repack -a -d --深度=250 --window=250

    我见过git gc aggressive prune and git repack a d depth 250 window 250建议用于减小不需要较长本地历史记录的本地 git 文件夹的大小 从我的阅读看来git repack是首选 有
  • 在maven多模块包中创建JAR文件作为聚合

    我有以下架构 现在 如果我正在创建父子关系并首先构建子项 然后构建父项 那么它会正常工作
  • 如何从 Java 9 中的另一个模块获取 ResourceBundle?

    我有两个模块 模块 a 和模块 b 模块 a 具有属性文件 com foo texts en properties 模块 a 导出com foo包裹 在 module b 中我想获取这个资源 为此 我在 module b 中执行以下操作 M
  • 仅使某一部分可滚动,而不是整个页面

    我正在开发一个项目 其中一个部分通过从数据库请求数据来填充元素 因此其中的元素数量变化很大 棘手的部分是 我们的设计基于这样的想法 不必在页面上滚动 而是在必要时在部分上滚动 我想用overflow在这些部分就足够了 但它没有给我预期的结果
  • 分割视图控制器不作为根视图控制器

    我有一个应用程序需要用户LOG IN 用户登录后 我想使用分割视图控制器来显示数据 诀窍是 苹果不希望我推动SplitViewController 因为他们希望它成为根视图控制器 从我的角度来看 这是可以的 但我需要用户先登录 任何人都知道
  • 如何在 QtCreator 中重命名文件 .h .cpp

    如何在QtCreator中重命名源文件 我已经更改了类的名称 但我没有看到更改它包含的文件的选项 我使用的是2 7 0版本 如果您使用 qmake 重命名很容易 在 项目 左侧面板中找到您的文件 然后在上下文菜单中选择 重命名 Qt Cre
  • Visual Studio 在字符类中查找并替换右方括号 ]

    我想创建一个否定字符类来匹配像这样的方括号标签 方括号标签 问题是 字符结束了字符类 I tried 但当我运行它时出现语法错误 这是在查找和替换正则表达式引擎中 它与标准 NET 引擎略有不同 仅供参考 您忘记转义最后的结束括号
  • 使用奇怪的命名空间序列化 XML?

    问题 用于序列化此 XML 内容的类看起来如何
  • 导航栏大标题到小标题切换不流畅 iOS 13,粘性

    我有一个UINavigationController默认值为navigationBar prefersLargeTitles true 我将其切换为false when I push进入一个新场景 我们称之为 DetailsViewCont
  • 为什么使用 DFS 而不是 BFS 来查找图中的循环

    DFS 主要用于查找图中的循环 而不是 BFS 有什么理由吗 两者都可以查找节点是否已经存在 遍历树 图时访问过 深度优先搜索比广度优先搜索更节省内存 因为您可以更快地回溯 如果使用调用堆栈 实现起来也更容易 但这依赖于不会溢出堆栈的最长路