int result = 0;
int i = 0;
while (i < n / 2){
result += arr[i];
i += 1;
while (i >= n / 2 && i < n){
result += arr[i];
i += 1;
}
}
printf("%d\n", result);
似乎将执行O(n)次,因为直到第一个循环执行1/2 * n次才会执行第二个循环。但我也可以说第一个循环执行O(n)次,第二个循环执行O(n)次,所以它是O(n ^ 2)。我现在很困惑,哪一个是正确的?
答案 0 :(得分:1)
内部循环只会启动一次,最后一个值为i
。所以你不能说&#34;对于外循环的每次迭代,我们运行内循环&#34;。相反,你可以说,对于外循环的每次迭代,它的主体在O(1)中运行,除之外的最后一次迭代,当它在O(n)中运行时#34 ;.所以总时间是O(n)* O(1)+ 1 * O(n)= O(n)。
另请注意,如果某些内容在O(n)中运行,则表示它也在O(n ^ 2)中运行并不完全错误。 O(n)只是更紧密的界限,通常,你应该得到最严格的上限。
答案 1 :(得分:1)
一种看待这种情况的方法是要意识到result += arr[i];
将在0和i
之间的n-1
的每个值上执行一次。因此,虽然代码看起来令人困惑,但它是 O(n)。