我已经查看了其他各种StackOverflow答案,它们都与我的讲师在幻灯片中写的不同。
深度优先搜索的时间复杂度为O(b^m),其中b是搜索树的最大分支因子,m是状态空间的最大深度。如果m比d大得多,这很糟糕,但如果搜索树“浓密”,则可能比广度优先搜索快得多。
他接着说。。
空间复杂度为O(bm),即动作序列长度的空间线性!只需要存储从根到叶节点的单个路径,以及路径上每个节点的剩余未扩展兄弟节点。
StackOverflow上的另一个答案是O(n m)。
我想这种DFS时间/空间复杂性是在人工智能课上教授的,而不是在算法课上。
此处DFS搜索树的含义略有不同:
节点是用于表示搜索树的簿记数据结构。状态对应于世界的配置。...此外,如果该状态是通过两条不同的搜索路径生成的,则两个不同的节点可以包含相同的世界状态。
引自《人工智能——现代方法》一书
所以这里的时间/空间复杂度主要集中在你访问节点并检查这是否是目标状态。@displayName已经给出了非常明确的解释。
当O(mn)在算法类中时,重点是算法本身,当我们将图存储为邻接列表以及我们如何发现节点时。
复杂度为 O(n m
),其中 n
是树中的节点数,m
是边数。
你的老师之所以将复杂性表示为O(b ^ m),
可能是因为他想强调深度优先搜索和广度优先搜索之间的区别。
使用BFS时,如果你的树的深度有很大的传播量,并且你期望在叶子上找到结果,那么显然DFS在这里会更有意义,因为它比BFS更快地到达叶子,即使它们都在相同的时间(工作)内到达最后一个节点。
当一棵树很深时,非树叶可以给出关于更深节点的信息,BFS可以检测出修剪搜索树的方法,以减少找到目标所需的节点数量。显然,你发现你可以修剪的子树越高,你可以跳过的节点就越多。当您使用DFS时,这就更难了,因为您优先到达一个叶子,而不是探索更接近根的节点。
时间复杂度:如果您可以在O(1)时间内访问每个节点,那么在分支因子为b和最大深度为m的情况下,此树中的节点总数将是最坏情况=1 b b b<sup>2</sup>b<sup<m-1</sup>。使用对几何序列求和的公式(甚至自己求解)表明,这等于=(bm-1)/(b-1),导致访问每个节点的总时间与bm成比例。因此复杂度=O(bm)。
另一方面,如果不使用分支因子和最大深度,而是使用节点数n,那么可以直接说复杂度将与n成比例或等于O(n)。
您在问题中链接的其他答案同样使用不同的术语。这个想法在任何地方都是一样的。一些解决方案也添加了边缘计数以使答案更精确,但一般来说,节点计数足以描述复杂性。
空间复杂性:最长路径的长度= m。对于每个节点,您必须存储其兄弟节点,以便当您访问了所有的子节点,并返回到父节点时,您可以知道接下来要探索哪个兄弟节点。对于路径中的m个节点,您必须为m个节点中的每一个额外存储b个节点。这就是你得到O(bm)空间复杂度的方法。
我必须为一个算法开发伪代码,该算法计算给定顶点V和边E的图G=(V,E)中连通分量的数量。 我知道我可以使用深度优先搜索或广度优先搜索来计算连接组件的数量。 但是,我想用最高效的算法来解决这个问题,但是我不确定每个算法的复杂度。 下面是一个用伪代码形式写DFS的尝试。 下面尝试以伪代码形式编写 BFS。 我的讲师说BFS与DFS具有相同的复杂性。 然而,当我搜索深度优先搜索的复杂度时,它是O(V^
主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以
本文向大家介绍深度优先搜索,包括了深度优先搜索的使用技巧和注意事项,需要的朋友参考一下 图遍历是按某种系统顺序访问图的所有顶点的问题。遍历图主要有两种方法。 广度优先搜索 深度优先搜索 深度优先搜索(DFS)算法从顶点v开始,然后遍历到之前未访问过的相邻顶点(例如x),并将其标记为“已访问”,然后继续处理x的相邻顶点,依此类推。 如果在任何一个顶点上遇到所有相邻顶点都被访问过,则它将回溯直到找到具
二叉树上广度优先搜索的空间复杂度是多少?因为它一次只存储一个级别,我不认为它会是O(n)。
遍历顶点的每个相邻边的时间复杂度是,例如,,其中是相邻边的数量。因此,对于顶点数,时间复杂度变为=,其中是图中的边总数。既然从队列中移除和添加顶点是,为什么它会作为添加到BFS的总体时间复杂度中?
3. 深度优先搜索 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线