以下代码的时间复杂度是多少?

时间:2015-05-06 09:48:01

标签: time-complexity

以下代码的复杂性似乎应该是O(n ^ 2),但它是O(n),怎么样?

void fun(int n, int arr[])
{
    int i = 0, j = 0;
    for(; i < n; ++i)
        while(j < n && arr[i] < arr[j])
            j++;
}

6 个答案:

答案 0 :(得分:3)

在第一眼看,由于两个循环,时间复杂度似乎是O(n ^ 2)。但请注意,变量j的每个值都没有初始化变量j。

因此,内部j ++最多将执行n次。

i循环也运行n次。

所以,整个事情都持续了O(n)次。

请注意有问题的功能与以下功能之间的区别:

void fun(int n, int arr[])
               {
int i = 0, j = 0;
for(; i < n; ++i)
{
    j = 0;
    while(j < n && arr[i] < arr[j])
        j++;
}

}`

还是不相信?

假设传递的数组的元素按递减顺序排列。我们将干透代码:

               Iteration 1 : i = 0, j = 0. arr[0] < arr[0] is false. So, the 
                             inner while loop breaks.
               Iteration 2: i =1, j = 0. arr[1] < arr[0] is true. j becomes 
               Iteration 3 : i = 1, j = 1. Condition false. We break. Note 
                            that j will remain 1 and is not reset back to 0.
               Iteration 4 : i = 2, j = 1. arr[2] < arr[1]. True. j = 2.
               Iteration 5 : i = 2, j = 2. Condition false. Break.
               Iteration 6 : i = 3, j = 2. arr[3] < arr[2]. True. j = 3.
               Iteration 7 : i = 3, j = 3. Condition false. Break.

正如您所看到的,内部while循环在这种情况下只运行一次。 因此,总迭代次数为2 * N.

答案 1 :(得分:1)

答案是O(n) 外循环运行'n'次,内循环仅在所有迭代中一次运行到'n',因为j的值永远不会重置为0。 因此答案是O(n + n)= O(n)。

答案 2 :(得分:1)

请注意,变量 j 并未针对变量 i 的每个值进行初始化。 因此,内部 j++ 最多将执行 n 次。 i 循环也运行了 n 次。 所以,整个过程运行了 O(n) 次。

答案 3 :(得分:0)

对于外循环的每次迭代,

j都不会重置为0。因此,它只运行一次n-1,与i相同。因此,您有两个从0到(最多)n-1的并行/混合迭代。

在每一步中,程序都会将i增加一个。该计划在i到达n时终止。 “外循环”运行n次。

还有一个关于j的“内循环”。但它所做的只是增加j,直到它达到i(最多,有时它会减少)。 j永远不会减少。因此,对于“外循环”的每次迭代,该部分总共最多运行n次(不是n次)。

答案 4 :(得分:0)

让我们考虑最坏情况,当执行while循环时最大值为no。时间。 最初:i=0j=0 =&gt; while arr[0] = arr[0]j=0后,循环不会执行。 第二次迭代:i=1j=0 =&gt; while循环在最坏的情况下执行,即j=1。 第三次迭代:i=2j=1 =&gt; while循环再次执行最坏情况,即j=2。 ... 第n次迭代:i=n-1j=n-2 =&gt; while循环再次执行最坏的情况,即j=n-1

所以,通过这个练习,我们每次都可以观察j = i-1i=0j=0之外,我们可以说while循环只是与for循环并行运行,因此是no。 while循环的执行次数等于no。执行for循环。 因此Order = O(n);

答案 5 :(得分:0)

答案为 O(n),因为'while'循环中的测试条件失败!

while(j < n && arr[i] < arr[j])

在开始时,i = 0和j = 0,这意味着arr [i] = arr [j],但是while循环测试条件为arr[i]<arr[j],而假设{{1} }

该代码仅运行arr[0]<arr[0]for循环。

最终答案是 O(n)而不是O(n ^ 2)

为清楚起见,您可以阅读以下两个示例

示例1:

n

输出为:

#include <stdio.h>

int main()
{
    int i = 0, j = 0; 
    int n = 5;
    int arr[] = {6,7,8,9,10,11};
    for(; i < n; ++i) 
    { 
        printf("\nThis is for loop, its running 5 times\n");
         
        while(j < n && arr[i] < arr[j]){ 
            j++;
            printf("\nThis is while loop!\n");
        }
    };
    return 0;
}

在上面的输出中,我们找不到'while'循环中出现的打印语句

示例2:

This is for loop, its running 5 times

This is for loop, its running 5 times

This is for loop, its running 5 times

This is for loop, its running 5 times

This is for loop, its running 5 times

在这里进行了小的更改 #include <stdio.h> int main() { int i = 0, j = 0; int n = 5; int arr[] = {6,7,8,9,10,11}; for(; i < n; ++i) { printf("\nThis is for loop, its running 5 times\n"); while(j < n && arr[i] <= arr[j]){ j++; printf("\nThis is while loop!\n"); } }; return 0; }

'='已使用

输出:

arr[i] <= arr[j]

在这里,执行while循环中的print语句,因为This is for loop, its running 5 times This is while loop! This is while loop! This is while loop! This is while loop! This is while loop! This is for loop, its running 5 times This is for loop, its running 5 times This is for loop, its running 5 times This is for loop, its running 5 times , arr [0] = arr [0]

对于上面显示的“示例2”,时间复杂度为arr[i]=arr[j]