繁体   English   中英

这个循环的时间复杂度是多少?

[英]What is the time complexity of this loop?

如何确定此循环的时间复杂度:

for(int i = N-1; i >= 0; i--)
{
    for(int j = 1; j <= i; j++)
    {
        if(numbers[j-1] > numbers[j])
        {
            temp = numbers[j-1];
            numbers[j-1] = numbers[j];
            numbers[j] = temp;
        }
    }
}

您可能已经注意到,这是气泡排序算法。 用于比较和分配的该算法的频率计数也相同吗?

计算复杂度

您需要添加正在执行的基本操作 / 机器指令 (取决于输入大小)

计算

for(int i = N-1; i >= 0; i--)
{          |        |     |
           c1       c2    c3
   for(int j = 1; j <= i; j++)
   {       |        |     |
           c4       c5    c6
      if(numbers[j-1] > numbers[j])--c7
      {
         temp = numbers[j-1];
         numbers[j-1] = numbers[j];
         numbers[j] = temp;
      }
   }
}

c1,c2,c3,c4,c5,c6,c7是执行与这些构造相对应的机器指令的成本(例如i> = 0,j <= i等)

Now for i=N-1 the innerloop is executed N-1 times
    for i=N-2 the innerloop is executed N-2 times
    ....

    for i=0 the innerloop is executed 0 times

因此执行内循环(N-1)+(N-2)+...1+0次= N *(N-1)/ 2

Look carefully the cost is
 = c1+ c2*(N+1) + c3*N+ c4*N+((N*(N-1)/2)+1)*(c5)+ (N(N-1)/2)*(c6+c7);
 = c1+c2+c5+ N*(c2+c3-(c5+c6+c7)/2) + N^2 * (c5/2 + c6/2 + c7/2)
 = c8 + N*c9 + N^2 *(c10)   [c8,c9,c10 are constants]

为什么我们将N + 1与c2相乘? 那是因为实际上i=-1时最后一次检查。

现在,对于较大的N值,N ^ 2占主导地位。因此,时间复杂度为O(N ^ 2)。 因此, T(N)= O(N ^ 2)

对于最佳情况和最坏情况,当前实现的复杂度均为O(n ^ 2),如果仅计算比较,仅计算赋值或同时计算这两者,则其复杂度相同。

以下是详细的计算,K是一个常数,具体取决于您要考虑时间复杂度的哪些运算:

如果您想要一种更高效的冒泡排序算法,请在Wiki页面上查看伪代码或此答案 ,您会发现O(n)最佳情况复杂度的算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM