int algorithm(int n) {
int k = 0;
while(n>1) {
n=n/2; // integer division
k++;
}
return k;
}
时间复杂度为O(log n)
?为什么呢?
答案 0 :(得分:4)
如果您将n
写为二进制数,例如11011011
,则在循环退出之前所需的连续值为
11011011
1101101
110110
11011
1101
110
11
1
因此,迭代次数(k
的最终值)等于n
的初始位数。从
2^(k-1) ≤ n < 2^k
这是具有k
位的条件,你绘制
k-1 ≤ log2(n) < k.
答案 1 :(得分:1)
原因是循环,除法和加法中的操作是O(1)。现在,考虑一些m的n = 2 ^ m的迭代次数,并将此数字与log_2(n)进行比较。推广到n,这不是2的幂是很容易的。通过i(n)表示输入n的循环的迭代次数,并且取2 ^ m <1。 n&lt; 2 ^(m + 1),注意i(n)= i(2 ^ m)(谢谢,整数除法)。
答案 2 :(得分:1)
您反复将 n 除以2,直到达到1或更低。因此,您的停止条件(大致)由等式 n / 2 ^ k = 1 &lt; =&gt;表示。 n = 2 ^ k &lt; =&gt; log_2 n = k(/是代码中的整数除法)。允许粗糙度,因为我们正在处理 O(),并且常量将会消失。