我无法理解为什么这段代码的大O符号为O(log 2 ^ n):
for (int i = n; i>=1; i=i/2){
sum = i+j;
}
我以为这是O(n)。
答案 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表示法描述了上限而不是紧束缚。