我查看了其他一些StackOverflow答案,它们与我的讲师在他的幻灯片中写的不同。
深度优先搜索的时间复杂度为O(b^m),其中b是搜索树的最大分支因子,m是状态空间的最大深度。如果m远大于d,则效率很低,但如果搜索树“多叉”,则可能比广度优先搜索快得多。
他接着说..
空间复杂度为O(bm),即与操作序列的长度成正比!只需要存储从根到叶节点的单个路径,以及每个路径上所有未扩展兄弟节点的剩余部分。
StackOverflow上的另一个答案指出时间复杂度为O(n + m)。
我查看了其他一些StackOverflow答案,它们与我的讲师在他的幻灯片中写的不同。
深度优先搜索的时间复杂度为O(b^m),其中b是搜索树的最大分支因子,m是状态空间的最大深度。如果m远大于d,则效率很低,但如果搜索树“多叉”,则可能比广度优先搜索快得多。
他接着说..
空间复杂度为O(bm),即与操作序列的长度成正比!只需要存储从根到叶节点的单个路径,以及每个路径上所有未扩展兄弟节点的剩余部分。
StackOverflow上的另一个答案指出时间复杂度为O(n + m)。
时间复杂度:如果您可以在O(1)的时间内访问每个节点,那么在分支因子为b且最大深度为m的情况下,该树中的节点总数会达到最坏情况= 1+b+b2+…+bm-1。使用求和等比数列的公式(甚至自己解决)告诉我们这总和= (bm-1)/(b-1),导致总访问每个节点的时间与bm成比例。因此,复杂度= O(bm)。
另一方面,如果您拥有节点数量n而不是使用分支因子和最大深度,则可以直接说复杂度与n成比例或等于O(n)。
您在问题中链接的其他答案也使用了不同的术语。所有地方的想法都相同。一些解决方案还添加了边缘计数以使答案更加精确,但通常,节点计数足以描述复杂度。
空间复杂度:最长路径的长度= m。对于每个节点,您必须存储其兄弟节点,以便当您访问所有子节点并返回父节点时,您可以知道要探索哪个兄弟节点。对于路径下的m个节点,您将不得不为每个节点存储额外的b个节点。这就是您获得O(bm)空间复杂度的方式。
O(n + m)
,其中n
是您的树中节点数量,m
是边的数量。O(b ^ m)
,可能是因为他想强调深度优先搜索和广度优先搜索之间的区别。