以下代码的复杂性似乎应该是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++;
}
答案 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=0
,j=0
=&gt; while arr[0] = arr[0]
即j=0
后,循环不会执行。
第二次迭代:i=1
,j=0
=&gt; while循环在最坏的情况下执行,即j=1
。
第三次迭代:i=2
,j=1
=&gt; while循环再次执行最坏情况,即j=2
。
...
第n次迭代:i=n-1
,j=n-2
=&gt; while循环再次执行最坏的情况,即j=n-1
。
所以,通过这个练习,我们每次都可以观察j = i-1
除i=0
和j=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]