我正在研究一般图的非递归DFS和BFS。除了前者使用堆栈而不是队列之外,唯一的区别在于它“延迟检查顶点是否已被发现,直到顶点从堆栈中弹出,而不是在推送顶点之前进行此检查”。为什么此“访问”检查顺序不同?或者换句话说,我们可以通过简单地用堆栈替换BFS中的队列来将BFS更改为非递归DFS吗?
我检查了所有我能找到的帖子,比如这个和这个,但是没有一个能澄清这个问题。
是的,这是唯一的区别。
您在wikipedia中展示的DFS算法有一个bug(至少是严重的低效)——它将重新插入已经访问过的节点。BFS one的设计更加合理,您可以将其更改为具有堆栈。
来自topcoder的一篇文章: “在BFS中,我们在将顶点推入队列时标记访问的顶点,而不是在DFS中弹出顶点时标记访问的顶点。” 注意:这是在使用显式堆栈(伪dfs)实现dfs时说的。 我的问题是为什么会这样?为什么我们不能在从队列弹出后标记访问的顶点,而在bfs的情况下推到队列上?
有没有人看到上述算法存在缺陷?我不是图论方面的专家,但我认为我对递归和迭代有很好的把握,我相信这也是一样的。我想让它在功能上与递归算法等价。它应该维护第一个算法的所有属性,即使不需要这些属性。 当我开始写它的时候,我并不认为我会有三个循环,但结果就是这样。当我环顾谷歌时,我看到了其他的迭代算法,它们只有一个双重嵌套的循环,然而,它们似乎不是从多个来源出发的。(即他们不会发现不连通图的每一个顶点)
我明白了在递归中,每个递归调用是如何堆栈在堆栈上的;如果超过堆栈限制,则会出现堆栈溢出。那么为什么Python的返回一个数字;递归调用的最大深度? 这不是取决于我在递归函数中做了什么吗?还是以某种方式将变量保存在堆栈以外的其他地方?它是如何工作的?
让我们回到函数,进行更深入的研究。 我们的第一个主题是 递归(recursion)。 如果你不是刚接触编程,那么你可能已经很熟悉它了,那么你可以跳过这一章。 递归是一种编程模式,在一个任务可以自然地拆分成多个相同类型但更简单的任务的情况下非常有用。或者,在一个任务可以简化为一个简单的行为加上该任务的一个更简单的变体的时候可以使用。或者,就像我们很快会看到的那样,处理某些数据结构。 当一个函数解决一
本文向大家介绍JS实现队列与堆栈的方法,包括了JS实现队列与堆栈的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现队列与堆栈的方法。分享给大家供大家参考,具体如下: 在面向对象的程序设计里,一般都提供了实现队列(queue)和堆栈(stack)的方法,而对于JS来说,我们可以实现数组的相关操作,来实现队列和堆栈的功能,看下面的相关介绍. 一、看一下它们的性质,这种性质决定了它们
本文向大家介绍python实现堆栈与队列的方法,包括了python实现堆栈与队列的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现堆栈与队列的方法。分享给大家供大家参考。具体分析如下: 1、python实现堆栈,可先将Stack类写入文件stack.py,在其它程序文件中使用from stack import Stack,然后就可以使用堆栈了。 stack.py的程序: