for (int i = 1; i < N; i *= 2) { ... }
这样的事情是对数复杂性的签名。
但是如何得到log(N)?
你能提供数学证据吗?
答案 0 :(得分:5)
有关算法复杂性的有用参考:http://en.wikipedia.org/wiki/Big_O_notation
在第n次迭代中,
i = 2^n
我们知道它会一直迭代到i >= N
因此,
i < N
现在,
2^n = i < N
N > 2^n
log2 N > log2 (2^n)
log2 N > n
我们知道它迭代n次,小于log2 N.
因此# iterations < log2 N
或# iterations
为O(log N)
QED。对数复杂度。
答案 1 :(得分:1)
将N
乘以2会再添加一次迭代,无论N
的大小如何。这几乎就是对数函数的定义 - 每当你将N
乘以一个常数时,它就会增加一个恒定的数量。
答案 2 :(得分:0)
您的代码将一直有效i < N
,每一步i *= 2
。我们说如果它运行log(N) + const
次,你的循环就具有对数的复杂性。 2 ^ log(N) = N
,所以在[log(N)] + 1
次i > N
之后。{/ p>