我试图找到以下循环的运行时间:
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)。我在这做错了什么?
谢谢
答案 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)
。