这是我的功能。这是一个简单的问题,我对答案是什么并不自信。
int calcul( int n) {
if(n=1)
return 1;
else
return calcul(n/2) + 1;
}
现在,为了获得复杂性,我做了:
T(n)= T(n / 2)+ O(1)
T(n / 2)= T(n / 4)+ O(1)
...
T(1)= O(1)
现在,添加方程式,我得到了
T(n)= O(1)+ O(1)......
那么最终答案是什么?
答案 0 :(得分:2)
每次将n
除以2
log n
次时,您执行的功能一次。
所以你得到O(log n)
。
修改强>
数字n
的对数(基数2)是必须提高2
才能获得n
。
即2^(log n) = n
,其中^
表示取幂。
现在,计算log n
近似值的一种简单方法是将n
除2
n > 1
。
如果您划分k
次,则获得n < 2^k
。
由于k - 1
分歧仍然产生n > 1
,您还有n >= 2^(k-1)
。
对2^(k - 1) <= n < 2^k
的每个成员取对数,得到k - 1 <= log n < k
。
答案 1 :(得分:1)
该算法与http://en.wikipedia.org/wiki/Binary_search_algorithm
非常相似所以,你可以阅读详细的解释,为什么它是O(log(n))
答案 2 :(得分:0)
我建议熟悉法师定理。在这种情况下,a = 1,b = 2且f = 0(1)。由于对于k = 0,f = Theta(1)= Theta(n ^(log_2(1)log ^ kn)= Theta(log ^ kn),我们处于定理的第二种情况,并且T(n)= Theta(log ^(k + 1)n)= Theta(log n)。
非常方便的定理,在与其他算法进行比较和进行其他类型的分析时非常有用。
答案 3 :(得分:0)
事情就是每次你的输入除以2直到它满足条件。恩。 n / 2,n / 4,n / 8 .... n / n
假设你输入为8,那么这个log 8 base 2将是3。 所以O(logn)。常数不应计算在内。
希望它有所帮助。