int G(int a[], int n) {
int x=0, i, j;
for(i=1; i<n; i=i*2){
for(j=0; j<i; j++)
x += a[j];
}
return x;
}
此算法O(n)的最坏情况下紧边界如何?是不是第一个循环未执行O(log(n)次,第二个for循环执行了O(n)次,给出O(n logn)?
答案 0 :(得分:2)
O( n )表示,当算法的输入大小为 n 时,算法最终最多需要与 n 成比例的步骤。在此表征中,内部循环为O( n ),但其输入大小为sscanf()
,因此它需要与i
成比例的步数。
累加执行内部循环的迭代次数。如果i
正好是2的幂,则为1 + 2 + 4 + 8 +…+ n
。该系列的总和为n/2
。因此,当程序的输入大小为n-1
时,整个程序将执行n-1
个迭代。所以是O( n )。
(如果n
不完全是2的幂,则迭代次数为n
,其中p-1
是2的最小幂,且不小于p
。 n
小于p-1
,它与2*n
成正比,因此程序仍为O( n )。