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

Algorithm 深度优先搜索的时间/空间复杂性,algorithm,time-complexity,depth-first-search,space-complexity,Algorithm,Time Complexity,Depth First Search,Space Complexity,我看过其他各种答案,它们都与我的讲师在幻灯片中写的不同 深度优先搜索的时间复杂度为O(b^m),其中b是 搜索树的最大分支因子,m是最大深度 状态空间的性质。如果m比d大得多,那就太可怕了,但是如果搜索 树是“浓密的”,可能比广度优先搜索要快得多 他接着说 空间复杂度为O(bm),即空间在作用长度上是线性的 序列只需要存储一条从根到叶的路径 节点,以及上每个节点的剩余未扩展同级节点 路径 on StackOverflow表示它是O(n+m)。复杂性是O(n+m),其中n是树中的节点数,m是边数

我看过其他各种答案,它们都与我的讲师在幻灯片中写的不同

深度优先搜索的时间复杂度为O(b^m),其中b是 搜索树的最大分支因子,m是最大深度 状态空间的性质。如果m比d大得多,那就太可怕了,但是如果搜索 树是“浓密的”,可能比广度优先搜索要快得多

他接着说

空间复杂度为O(bm),即空间在作用长度上是线性的 序列只需要存储一条从根到叶的路径 节点,以及上每个节点的剩余未扩展同级节点 路径

on StackOverflow表示它是O(n+m)。

复杂性是
O(n+m)
,其中
n
是树中的节点数,
m
是边数

您的老师之所以将复杂性表示为
O(b^m)
,可能是因为他想强调深度优先搜索和广度优先搜索之间的区别

当使用BFS时,如果你的树与它的深度相比有非常大的扩展量,并且你希望在叶子上找到结果,那么显然DFS在这里更有意义,因为它比BFS到达叶子的速度更快,即使它们在相同的时间(功)内到达最后一个节点

当一棵树非常深,而非叶子可以提供关于更深节点的信息时,BFS可以检测到修剪搜索树的方法,以减少找到目标所需的节点数量。显然,树越高,可以修剪的子树越多,可以跳过的节点就越多。
当您使用DFS时,这会更加困难,因为您将到达叶的优先级置于探索更接近根的节点的优先级之上

时间复杂度:如果您可以在O(1)时间内访问每个节点,那么分支因子为b,最大深度为m,则此树中的节点总数在最坏情况下为=1+b+b2+…+bm-1。使用一个几何序列求和的公式(甚至我们自己求解)告诉我们,这个求和为=(bm-1)/(b-1),结果是访问每个节点的总时间与bm成正比。因此复杂性=O(bm)

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

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



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

我认为DFS的时间/空间复杂度是在AI类中教授的,而不是在算法类中教授的

此处的DFS搜索树的含义稍有不同:

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

引自《人工智能——现代方法》一书

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


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

如果兄弟节点存储在数组/链表中,则只能保留数组索引/指向列表中第一个元素的指针,这使得空间复杂度为O(m)@Witiko:这绝对正确。我应该在答案中写下这样一个巨大的改进是可能的。当提问者只想知道如何通过O(bm)来计算复杂性时,他们没有这样想。深度优先搜索和广度优先搜索是通用术语,可以引用很多算法,例如搜索树或对游戏状态进行暴力搜索。