[英]Calculating time complexity from code line by line for while and switch case and a sample case for insertion sort
有许多指南可以帮助您了解如何通过查看代码/算法并逐行应用时间来计算时间复杂度。 但是我发现while
和switch
循环很困难。 有人可以帮我解决在这种情况下的解决方法吗?
插入排序的示例示例以及如何被卡住:
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] < temp
每n
,则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.