我在确定空间和时间复杂性方面遇到了一些麻烦。例如,如果我的树具有分支因子 b 并且最多具有 d 的深度,那么如何计算时间和空间复杂度?我知道它们是O(b ^ d)和O(bd),但我的问题是如何获得这些值。
谢谢!
答案 0 :(得分:6)
树中的所有节点必须在某个时刻生成一次,并且假设生成节点需要花费一个恒定时间c
(常数时间可以变化,您可以选择{{1生成任何节点的最高常量时间)。顺序由算法确定,并确保不必重复扩展节点。
c
正如您在图中所见,计算第一个级别需要nodes b=2 b=3
b^0 * *
/ \ / | \
b^1 * * * * *
/ \ / \ / | \ / | \ / | \
b^2 * * * * * * * * * * * * *
... ...
费用 - 确切地说c*b^0
。树中的下一级将包含c
个节点,生成第二级需要b^1
。对于第三级,第二级中的每个节点将再次出现c*b^1 = c*b
个节点,这意味着b
个节点和b*b^1 = b^2$
的成本。
在深度为c*b^2
的树的最深层,将有d
个节点,因此该级别的工作为b^d
。到目前为止所完成的工作总量为c*b^d
。对于复杂性,我们只关注最快的上升期并降低常数,以便得到:
c*b^0 + c*b^1 + ... + c*b^d
。
本质上:时间是一个函数O(c + c*b + ... + c*b^d) = O(c*b^d) = O(b^d)
和f(d) = SUM(i=1..d){c*b^i}
。
该图显示了O(f(d)) = O(b^d)
不同阶段的算法。 b=3
表示当前已展开的节点,*
表示未知节点,?
表示已完全计算得分的节点。
+
为了计算节点的分数,您可以展开节点,选择一个子节点并递归展开,直到到达深度为 branching factor b = 3 space
* * * * b
/ | \ / | \ / | \ / | \
* ? ? * ? ? + * ? + + * b
/ | \ / | \ / | \ / | \
* ? ? + + * + * ? + + * b
/ | \ / | \ / | \ / | \
* ? ? + * ? + * ? + + * b
的叶节点。完全计算子节点后,转到下一个子节点。计算完所有d
子节点后,将根据子节点计算父节点得分,此时可以从存储中删除子节点。这在上图中说明,其中算法显示在4个不同的阶段。
您可以随时扩展一个路径,并且需要b
存储来存储每个级别的所有子节点。这里再次假设您需要每个节点有一个恒定的空间量。关键是任何子树都可以根据其来概括。由于路径的最大长度为c*b
,因此您最多需要d
个空间。如上所述,我们可以删除常数,我们得到c*b*d
。
答案 1 :(得分:4)
空间复杂度相当于“我需要为此算法分配多少内存”。 时间复杂度相当于“执行需要多长时间(从抽象意义上说)”。
具有分支因子b和深度d的树将在其零级别具有一个节点,在其第一级别具有b个节点,在其第二级别具有b * b = b ^ 2个节点,b ^ 2 * b = b ^ 3在这四个等级(深度3)中,它有1 + b + b ^ 2 + b ^ 3。就复杂性而言,我们只保留最高阶项,并且通常会丢弃任何乘法常数。因此,对于空间复杂性,最终会出现O(b ^ d)的复杂性。
现在时间复杂,你的计数不是节点的数量,而是你的算法将完成的循环或递归调用的数量(最坏的情况)。
我准备出门,假设你在谈论IDDFS。在this wiki文章中很好地解释了O(b ^ d)和O(bd)的来源。