如何证明对数复杂度

时间:2012-08-21 09:37:33

标签: complexity-theory

for (int i = 1; i < N; i *= 2) { ... }

这样的事情是对数复杂性的签名。

但是如何得到log(N)?

你能提供数学证据吗?

3 个答案:

答案 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# iterationsO(log N)

QED。对数复杂度。

答案 1 :(得分:1)

N乘以2会再添加一次迭代,无论N的大小如何。这几乎就是对数函数的定义 - 每当你将N乘以一个常数时,它就会增加一个恒定的数量。

答案 2 :(得分:0)

您的代码将一直有效i < N,每一步i *= 2。我们说如果它运行log(N) + const次,你的循环就具有对数的复杂性。 2 ^ log(N) = N,所以在[log(N)] + 1i > N之后。{/ p>