深度优先搜索的时间/空间复杂性

时间:2016-04-07 14:44:54

标签: algorithm time-complexity depth-first-search space-complexity

我查看了其他各种StackOverflow答案,它们与我的讲师在幻灯片中所写的内容完全不同。

  

深度优先搜索的时间复杂度为O(b ^ m),其中b为   搜索树的最大分支因子,m是最大深度   国家空间。如果m比d大得多,但是如果搜索,那就太糟糕了   树是"浓密的",可能比广度优先搜索快得多。

他继续说..

  

空间复杂度为O(bm),即行动长度的空间线性   序列!只需存储从根到叶的单个路径   节点,以及每个节点上剩余的未扩展兄弟节点   路径。

StackOverflow上的

Another answer表示它是O(n + m)。

3 个答案:

答案 0 :(得分:13)

时间复杂度:如果您可以在O(1)时间内访问每个节点,那么使用b的分支因子和m的最大深度,此树中的节点总数将为= b * b * b ... m次= b m ,导致访问每个节点的总时间与b m 成比例。因此复杂性= O(b m )。

另一方面,如果不是使用分支因子和最大深度,而是拥有 n 的节点数,那么你可以直接说复杂度将与 n <成比例/ em>或等于 O(n)

您在问题中链接的其他答案同样使用不同的术语。这个想法无处不在。一些解决方案也增加了边缘计数以使答案更加精确,但一般来说,节点数足以描述复杂性。

空间复杂度:最长路径的长度= m。对于每个节点,您必须存储其兄弟节点,以便当您访问所有子节点并返回父节点时,您可以知道接下来要探索的兄弟节点。对于路径下的m个节点,您必须为每个m个节点存储额外的b个节点。这就是你获得O(bm)空间复杂度的方法。

答案 1 :(得分:1)

复杂性为describe("Verify Login", function(){ it("Verify Application Login",function(){ browser.get("http://juliemr.github.io/protractor-demo/"); }); }); ,其中O(n + m)是树中的节点数,n是边数。

您的老师将复杂性表示为m的原因可能是因为他想强调深度优先搜索和广度优先搜索之间的区别。

当使用BFS时,如果您的树与其深度相比具有非常大的差异,并且您期望在叶子上找到结果,那么显然DFS在这里会更有意义因为它比BFS更快到达叶子,即使它们都在相同的时间内(工作)到达最后一个节点。

当树非常深,而非叶子可以提供有关更深节点的信息时,BFS可以检测修剪搜索树的方法,以减少查找目标所需的节点数量。显然,您发现的树越高,您可以修剪子树,您可以跳过的节点越多。 当您使用DFS时,这会更难,因为您优先考虑探索更接近根的节点。

答案 2 :(得分:1)

我认为这个DFS时间/空间复杂性是在AI类上讲授的,而不是在Algorithm类上讲授。

这里的DFS搜索树的含义略有不同:

  

节点是用于表示搜索的簿记数据结构   树。状态对应于世界的配置。 ...   此外,两个不同的节点可以包含相同的世界状态if   该状态是通过两个不同的搜索路径生成的。

引自“人工智能 - 现代方法”一书

因此,这里的时间/空间复杂性集中在您访问节点并检查这是否是目标状态。 @displayName已经给出了非常明确的解释。

当O(m + n)在算法类中时,焦点是算法本身,当我们将图形存储为邻接列表以及我们如何发现节点时。