我找到了这个Big-O符号计算的两个答案,其中一个是正确的

时间:2017-05-31 04:43:11

标签: algorithm big-o

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)。我现在很困惑,哪一个是正确的?

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)