void fun(int n, int arr[])
{
int i = 0, j = 0;
for(; i < n; ++i)
while(j < n && arr[i] < arr[j])
j++;
}
给出的答案是:变量j的每个值都没有初始化变量j,因此时间复杂度为O(n)
我不太明白。谁能解释一下?
答案 0 :(得分:1)
查看您的函数与此之间的差异(这是在O(n 2 )时间复杂度) -
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++;
}
}
在您的函数中,变量j
未针对变量i
的每个值进行初始化。因此,内部循环最多n次。
修改1 - 从j=0
到j=n
是内部n
循环的最大while
次迭代。由于您永远不会在j
后再次初始化j=n
,因此内部while
循环永远不会迭代。因此,最大值(可能会减少,具体取决于第二个条件arr[i] < arr[j]
),您有n
次迭代的内部while
循环一次 。外for
循环显然会迭代n
次。因此,即使在最糟糕的情况下,您也有n+n=2n
而非n
2
。
编辑2 - @Kerrek SB 回答这是现货 -
-
“代码在j
递增n
次时结束。j
永远不会递减,并且最多n
尝试递增它(通过{{ 1}})“
答案 1 :(得分:0)
外循环执行n
次。
内部循环仅在j < n
时继续,并且由于j
在每一步中递增,因此总执行时间不能超过n
次。