以下循环的运行时间

时间:2013-03-22 19:22:07

标签: algorithm loops for-loop big-o asymptotic-complexity

我试图找到以下循环的运行时间:

int m=1;
for(i=1;i<=k;i++)
{
    for(j=1;j<=A[i];j++)
    {
        B[m]=i;
        m++;
     }
}

这里,A是一个保持整数的数组,这些整数的总和是n。例如,如果A的长度为2,A [1] = 2且a [2] = 4,那么内循环将运行6次。

因此,在我的讲义中,它说这段代码的运行时间是O(n + k)。但假设,例如,k为5,阵列A的长度为4,A [1] = 3,A [2] = 0,A [3] = 0,A [4] = 9,A [ 5] = 0。所以,n = 12。然后,对于k = 1,内循环将迭代2次,对于k = 2,外循环将迭代1次,对于k = 3,外循环将运行1次,对于k = 4,内循环将运行9次并且对于k = 5,外环将运行1次,因此迭代总数为14.这大于k和n,并且运行时间既不是O(n)也不是O(k)。我在这做错了什么?

谢谢

1 个答案:

答案 0 :(得分:3)

外部循环将迭代 k 次,因为你正在做

for(i=1;i<=k;i++)

内循环的迭代总数为

sum (A[i])的{​​{1}},您知道的是i = 1...k

这给了= n次迭代。由于内循环内的东西在恒定时间内运行,因此复杂度为n + k

修改

当我们说非负面函数O(n + k)f(n)时,我们的意思是什么?

<强>答案:

查找相应的Stackoverflow问题

What is a plain English explanation of "Big O" notation?

<强> EDIT2:

实际上,上面链接中的答案非常冗长,所以为了完整起见,这里是数学定义。

O(g(n))成为非负面功能。然后我们说f(n)(读&#34; f(n)是g(n)&#34;的大哦)如果存在正常数f(n) = O(g(n))c这样

n0

适用于所有f(n) <= c g(n)