繁体   English   中英

针对while和switch情况以及插入排序的示例情况逐行代码计算时间复杂度

[英]Calculating time complexity from code line by line for while and switch case and a sample case for insertion sort

有许多指南可以帮助您了解如何通过查看代码/算法并逐行应用时间来计算时间复杂度。 但是我发现whileswitch循环很困难。 有人可以帮我解决在这种情况下的解决方法吗?

插入排序的示例示例以及如何被卡住:

int i,j,n=a.length,temp; //c1
        for(i=1;i<n;i++) // (n)
        {
            j=i-1; // c2
            temp=a[i]; // c3
            while(j>=0&&a[j]>temp) (Stuck here)
            {
                a[j+1]=a[j];// c4
                j=j-1; //c5
            }
            a[j+1]=temp; //c6
        }

由于您不仅要遍历集合,还需要在某些时候根据某些条件中断循环,因此您的结果将出现最佳情况和最坏情况。

外部的for循环将始终执行n - 1次迭代。 在计算复杂度时,通常会省略常量,因此您的外循环将具有恒定的n

while循环将取决于两个条件: j大于0且j大于temp

如果每个n都保持a[j] > temp ,那么您的代码应该具有n的复杂度。

另一方面,如果a[j] < tempn ,则j>=0将是确定条件。 j将开始很小并随着n增加而增加,因此两个循环都将运行nj次。

由于n < nj ,因此,您可以得出结论,最佳情况的时间复杂度为n 另一方面,最坏的情况是nj 由于j = n - 1 ,您可以说复杂度为n(n - 1) ,这将导致n^2 - n ,这将大致导致最坏的时间复杂度n^2

如果仅考虑while(j>=0&&a[j]>temp)循环,那么对于最佳情况而言,它是O(1);对于最坏情况而言,它是O(n)。

但是,如果同时考虑了两个循环,则最坏的情况是内部while循环会发生一些变化。 这是一个例子:

  • 对于i = 1 ,在最坏的情况下,内部while循环将运行1次。

  • 对于i = 2 ,在最坏的情况下,内部while循环将运行2次。

  • 对于i = 3 ,在最坏的情况下,内部while循环将运行3次。

  • 等等。

结论:在最坏情况下,内部while循环将执行与i值相同的次数,而在最坏情况下,仅执行一次。

内部while循环在最坏的情况下执行的总次数为1+2+3+...+n ,可以通过以下数学公式表示: n^2/2 + n/2

因此,最坏情况下的时间复杂度为n ^ 2/2 + n / 2,可以简化为O(n ^ 2)。 最好的情况是O(n)。

暂无
暂无

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

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