为什么DFS被认为具有空间复杂度?


11

根据这些说明DFS被认为具有空间复杂度,其中是树的分支因子,是状态空间中任何路径的最大长度。O(bm)bm

在此Wikibook页面上的“ 不知情的搜索”中也是如此

现在,有关DFSWikipedia文章的“信息框” 针对算法的空间复杂性提供了以下内容:

O(|V|),如果遍历整个图而没有重复,则最长路径搜索长度为隐式图,而不会消除重复的节点O()

这更类似于我认为DFS的空间复杂度,即,其中是算法达到的最大长度。O(m)m

我为什么认为是这种情况?

好吧,基本上,我们不需要存储除当前正在查看的路径的节点以外的任何其他节点,因此在Wikibook和我推荐给您的注释提供的分析中,没有必要乘以至。b

此外,根据Richard Korf IDA *上发表的这篇论文,DFS的空间复杂度为,其中被视为“深度截止”。O(d)d

那么,DFS的正确空间复杂度是多少?

我认为这可能取决于实现方式,因此,我希望能对不同已知实现方式的空间复杂性做出解释。


DFS is considered to […] of the tree并不是每个遍历深度的图形都是一棵树
greybeard

说“这里的DFS实现成本为X”和“可以实现DFS成本为X”之间是有区别的。因此,似乎在争论第二种不同的陈述,这些陈述根本不需要矛盾。(请注意,因为根本就没有矛盾,如果意味着什么也没有。)ø b O(bm)O(m)O(bm)
拉斐尔

@greybeard您能告诉我一个示例,其中在图形上进行深度优先遍历不会生成树吗?
nbro

example where a depth-first traversal on a graph would not result in a tree无需过多考虑:解析。(等待:您的意思是result in a tree什么??问题是关于搜索/遍历图的。)
greybeard

1
@greybeard根据到目前为止找到的所有定义。在重新定义节点的位置找到一个定义,然后我们可以进行讨论。
nbro

Answers:


7

这取决于您究竟叫什么DFS。例如,考虑一下Wikipedia中描述的DFS迭代算法,并假设您在树上运行它,这样就不必跟踪已访问的节点。假设你在一个完整的运行的深度进制树。我们可以用最大[个长度超过的单词来识别树中的节点。该算法的操作如下:m [ b ] mbm[b]m

  1. 从根开始。将推入堆栈(以相反的顺序)。1,2,,b

  2. 弹出,然后将推入堆栈。11 12 ... 1 b111,12,,1b

  3. 弹出,然后将推入堆栈。111 112 ... 11 b11111,112,,11b

  4. 弹出,然后将推入堆栈。 1 m1 m 1 2 1 m 1 b1m11个1个-1个21个-1个b

此时,堆栈包含

1个1个-1个21个-1个b11211b121个b2b

总共节点。您可以检查一下这是否是使堆栈大小最大化的时间点。b-1个+1个


2
一品脱的时间使医生远离。
greybeard

3

这里有两点要说明:

  1. 如果将当前节点的所有后代引入堆栈,则有效地,空间复杂度为,其中是分支因子,是最大长度。Yuval Filmus的答复确实涉及此案。但是,请注意,通常远大于。此外,在许多领域中,例如滑动块拼图,由一个常量(在特定情况下为4)限制,因此我们可以肯定地说DFS的空间复杂度为。b d d b b O d ØbdbddbbØd

  2. 诚然,事实并非总是如此。例如,在“煎饼难题”中,分支因子随最佳解的长度而增长,并且两者都具有相似的值。尽管如此,空间复杂度仍为。要看到这一点,只需调整任何节点的扩展过程即可:而不是插入当前节点的所有后代(如Yuval Filmus所建议),依次插入它们。你先产生第一传人和后立即您在深度优先顺序进行操作---因为事实上,你并不需要在这一点上所有其他后代d bØd。如果您曾经回溯到该节点,则其后代将从堆栈中删除。接下来,生成第二个后代,并再次按深度优先顺序进行。如果您回溯到该节点,则生成第三个节点,依此类推,直到没有更多后代为止。以这种方式进行操作,无论分支因子是多少,堆栈中都将只有节点。db

总而言之,我永远不会说DFS的空间复杂度为,我声称其空间复杂度为。O d ØbdØd

希望这可以帮助,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.