【发布时间】:2015-12-14 15:05:55
【问题描述】:
我在尝试计算这段代码的时间复杂度时遇到了一些问题:
function foo (int a):
if a < 1:
return 1
else:
for i = 1 to 4:
foo(a - 3)
for i = 1 to 4:
foo(a / 2)
end function
尽我所能:
T(n) = 1 if n<1
T(n) = 4T(n-3) + 4T(n/2) if n>=1
= 4(4T(n-6) + 4T((n-3)/2)) + 4(4T(n/2 - 3) + 4T(n/4))
~ 4^2 (T(n-6) + T((n-3)/2) + T(n/2-3) + T(n/4))
现在,这很复杂,因为下一个 T 的数量增加了 2^n 并且孩子也很复杂。
还有其他方法可以解决这个问题吗?
【问题讨论】:
-
Foo 最多只会返回 1 并发布代码
-
有经验的方法。使用 n=10, 100, 1000, 10.000, ... 运行它并绘制曲线。如果足够的话,它至少应该给你一个直觉
-
这在我看来不像 C 或 C++ 代码。是伪代码吗?第二个 for 循环的缩进是什么意思,它是否是“else”块的一部分?在 C / C++ 中不会这样。
-
@vmg:这不是真的,低端数据点将受到缓存、流水线、优化、内联以及芯片和编译器实际执行的各种其他事情的高度影响。如果你想进入算法的大 O 复杂度肯定占主导地位的状态,你必须运行非常大的数字。我认为尝试以这种方式“推断”大 O 复杂性通常不太实际。
-
@ChrisBeck:时间确实没有问题,但是添加一个对
foo的调用次数的计数器是微不足道的。
标签: algorithm language-agnostic time-complexity complexity-theory recurrence