【发布时间】:2013-09-13 05:43:13
【问题描述】:
如何计算这部分代码的时间复杂度或 T(n)?
j=1;
while(j<=n/2){
i=1;
while(i<=j){
cout<<j<<i;
i++;
}
j++
}
我认为你可以假设 n 可以被 2 整除。
【问题讨论】:
标签: performance algorithm time complexity-theory
如何计算这部分代码的时间复杂度或 T(n)?
j=1;
while(j<=n/2){
i=1;
while(i<=j){
cout<<j<<i;
i++;
}
j++
}
我认为你可以假设 n 可以被 2 整除。
【问题讨论】:
标签: performance algorithm time complexity-theory
计算总迭代次数并不难。 j 的范围是 j=1, 2, ..., n/2。对于 j 的每个值,i 的范围是 i = 1, 2, ..., j。因此,对于外部循环的每个值,内部循环都有 j 次迭代。这意味着总的迭代次数是:
T(n) = 1 + 2 + 3 + ... + n/2 = (1/2)(n/2)(n/2+1) = (1/8)(n^2 + 2n)。
[注意:我在这里使用恒等式 1 + 2 + ... + k = k(k+1)/2。]
如前所述,这个函数是 O(n^2)。
【讨论】:
while(j<=n/2){ | n/2+1
i=1; | n/2
while(i<=j){ | 1+n/2(n/2+1)/2 =1+n(n+1)/8
cout<<j<<i; | n(n+1)/8
i++; | n(n+1)/8
} |
j++ | n/2
} |
总体:O(n2)
【讨论】:
除以常数不会改变O(...)。确切的可分性也不重要。就像j 一直到n 的算法一样,这是一个O(N^2) 算法。
【讨论】:
O(n),除非除数取决于n(在这种情况下它不再是一个常数)。