CODE:
void fun(int n){
if(n>2){
for(int i=0;i<n;i++){
j=0;
while(j<n){
cout<<j;
j++;
}
}
fun(n/2);
}
}
这就是我的想法: 递归部分运行log(n)次? 并且在每次递归调用期间,for循环将运行n ^ 2次,其中n在每次递归调用中变为一半。 那么它是n ^ 2 +(n ^ 2)/ 4 +(n ^ 2)/ 16 + ... + 1?
答案 0 :(得分:3)
你是对的,所以大(O)是n ^ 2,因为系列的总和n ^ 2 +(n ^ 2)/ 4 +(n ^ 2)/ 16 + ... + 1从未超过2n个^ 2
答案 1 :(得分:2)
cout
的写入次数由以下重复给出:
T(N) = N² + T(N/2).
通过有根据的猜测,T(N)
可以是二次多项式。因此
T(N) = aN²+bN+c = N² + T(N/2) = N² + aN²/4+bN/2+c.
通过识别,我们有
3a/4 = 1
b/2 = 0
c = c.
和
T(N) = 4N²/3 + c.
使用T(2)= 0
,
T(N) = 4(N²-4)/3
显然是O(N²)
。
答案 2 :(得分:0)
这是简单的数学。复杂度为n ^ 2 +(n ^ 2)/ 4 +(n ^ 2)/ 16 + ... + 1.它是(n 2 *(1 + 1/4 + ...))。数学表明无限系列收敛到4/3(公式为:1 /(1 - 1/4))。
它实际上给出了O(n2)。