以下功能的时间复杂度是多少?

时间:2015-06-18 10:32:42

标签: c big-o time-complexity

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)

我不太明白。谁能解释一下?

2 个答案:

答案 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=0j=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次。