大O表示法 - 请解释O(log2n)

时间:2017-10-29 03:19:08

标签: java for-loop big-o

我无法理解为什么这段代码的大O符号为O(log 2 ^ n):

for (int i = n; i>=1; i=i/2){
    sum = i+j;
}

我以为这是O(n)。

3 个答案:

答案 0 :(得分:6)

这是O(log_2 n)。因为它会在n变为1之前运行。

在第k步之后假设整个事情变成1。

所以n/2^k = 1

k=log_2 n

复杂性为O(log_2 n)

答案 1 :(得分:1)

我第一次弄错了,但是看看这个,在for的每个循环中,你做i / 2所以最后它会抛出n log2个元素。所以总的来说它将是0(log2 n)

答案 2 :(得分:0)

简单回答:

正如@coderredoc解释的那样,这段代码片段是O(log n)。对数的基数在渐近符号中是无关紧要的,因为它只会产生常数的差异。

深入回答: 如果在学术背景下提出这个问题;那么请阅读更多关于big-O表示法和big-Θ表示法之间的区别。 http://web.mit.edu/16.070/www/lecture/big_o.pdf https://en.wikipedia.org/wiki/Big_O_notation#Matters_of_notation

对于您的具体问题,任何O(log n)的代码都可以被认为是O(2 ^ n)或O(n)或O(log 2 ^ n)。因为,big-O表示法描述了上限而不是紧束缚。