我有一个树遍历算法,它通常在O(b m )中运行,其中b是分支因子,m是最大深度。
使用迭代加深,该算法反复运行,增加深度m次:
O(b m )=b⁰+b¹+b²+ ... + b m
基于我对时间复杂度的有限理解,我们采用最大元素,因为这是随着时间的推移最重要的元素,因此元素将是b m ,其中m是达到的最大深度。
因此,根据这些知识,我会得出结论,迭代加深算法也在O(b m )中运行。
然而,从逻辑的角度来看,我无法理解树遍历可能具有完全相同的时间复杂度,无论算法是在深度m运行一次,还是m次运行直到深度m。
b m 固有地小于Σ k = 0,...,m b k 。因此迭代加深的时间复杂性不应该更高吗?
或者有什么我不明白的东西?
答案 0 :(得分:3)
基本上你问为什么以下两个函数在大O方面具有相同的时间复杂度(因为它们都是O(n ^ m)):
原因在于,在某些时候,对于n和m的值,术语n ^ m使这些函数的所有其他项相形见绌。随着输入的增长,整个函数的运行时间将由n ^ m确定。
即使你想出一个n ^ m + 1000000000000的函数,那么在某个时刻n ^ m仍然是运行所需时间的决定性术语。换句话说,两个函数的运行时间都由一个函数限制,其中n ^ m乘以某个常数。
在您的示例中,在深度m处运行树遍历一次或运行m次,直到深度m具有相同的时间复杂度,因为随着树的增长,在深度m运行的运行时间使所有其他运行相形见绌。看看在深度m运行需要多长时间,基本上只需要找到一个限制两个任务的运行时间的函数。
再举一个例子,我们可以想到两个函数都是O(n):
似乎f1在n增长时做的更多,所以说两者都是O(n)并不“公平”。但它们的时间复杂度受线性函数的限制:对于某些(大)常数c,我可以说两个函数的运行时间将低于f(n)= cn,因此整个时间复杂度为O(n)。
答案 1 :(得分:2)
“完全相同”的时间复杂度与“花费精确时间”不同。说“完全相同的时间复杂度”就像是说“以相同的速度增长,达到恒定因子”,这是一个粗略的估计。
例如,如果b = 3
,您要比较这两个数字序列:
3^m, or (1, 3, 9, 27, 81, ...)
3^0+3^1+...+3^m, or (1, 4, 13, 40, 121, ...)
让我们表示第一个数字D(m)
(表示“DFS”),第二个表示I(m)
(表示“迭代深化”),然后
I(m) = 3/2 * D(m) - 1/2
I(m)肯定大于D(m),但它们具有相同的“增长顺序”。这个想法用I(m) = O(D(m))
表示。
数学上I(m) = O(D(m))
,因为k
存在I(m) < k * D(m)
所有m
的{{1}};这里k = 3/2
。