Java 从while和switch case的逐行代码计算时间复杂度,以及插入排序的示例case
有许多可用的指南告诉您如何通过查看代码/算法并逐行应用来计算时间复杂度。然而,我发现Java 从while和switch case的逐行代码计算时间复杂度,以及插入排序的示例case,java,algorithm,sorting,time-complexity,Java,Algorithm,Sorting,Time Complexity,有许多可用的指南告诉您如何通过查看代码/算法并逐行应用来计算时间复杂度。然而,我发现切换循环时很难执行&切换。有人能帮我弄清楚在这种情况下该怎么办吗 插入排序的示例以及我是如何被卡住的: 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
切换循环时很难执行&切换。有人能帮我弄清楚在这种情况下该怎么办吗
插入排序的示例以及我是如何被卡住的:
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
}
inti,j,n=a.长度,温度//c1
对于(i=1;i=0&&a[j]>temp)(卡在此处)
{
a[j+1]=a[j];//c4
j=j-1;//c5
}
a[j+1]=温度//c6
}
因为您不仅仅是在查看集合,而是在某个时刻根据某种情况打破循环,因此您的结果将有一个最佳情况和一个最坏情况
外部for循环将始终执行n-1
迭代。计算复杂度时,通常会忽略常数,因此外部循环的复杂度将为n
while循环取决于两个条件:j
大于0和j
大于temp
如果a[j]>temp
对每个n
都保持不变,那么您的代码的复杂性应该是n
另一方面,如果对于每个n
,a[j]
,则j>=0
将是确定条件j
将开始变小,并随着n
的增加而增加,因此两个循环将运行nj
次
既然n
,那么您可以得出结论,最佳情况场景的时间复杂度为n
。另一方面,最坏的情况是nj
。由于<代码> J= N 1 - <代码>,您可以说,复杂性是<代码> n(n 1)<代码>,这将导致<代码> n ^ 2 -n>代码>,这将粗略地导致<代码> n ^ 2 < /代码>的最坏情况下的时间复杂度。 如果您考虑您的<代码>(j>=0 & & [j]>TEMP)< /C>循环>,则它是最好的实例CiRiRo和O(n)的O(1)。在最坏的情况下
但是,如果将这两个循环都考虑在内,则内部while
循环的最坏情况会有一点变化。下面是一个例子:
- 对于
i=1
最坏情况,内部while
循环将运行1次
- 对于
i=2
最坏情况,内部while
循环将运行2次
- 对于
i=3
最坏情况,内部while
循环将运行3次
- 等等
结论:对于最坏的情况,内部while
循环将执行与i
值相同的次数,而对于最佳情况,仅执行1次
最坏情况下,内部while
循环将执行的总次数为1+2+3+…+n
,可通过以下数学公式表示:n^2/2+n/2
因此,最坏情况下的时间复杂度为n^2/2+n/2,可以简化为O(n^2)。最好的情况是O(n)。有人吗?请更正我的计算中是否有任何错误,并尝试找出不同情况下的循环运行-最坏/最佳/平均我知道这一点。但我只是想通过查看代码来计算,就像我在mt示例中介绍的一样。对于For循环,它将是n阶的,我被困在循环中,而复杂度的计算并不总是那么直接。当循环执行的数量取决于实际数据(动态)时,您需要考虑数据集对于您的算法来说是最差/最佳/平均的情况,并根据复杂度来决定复杂度。这里我以排序数组的最佳情况为例,按递增顺序。对于tje For循环,它将按照n顺序进行。如果我考虑两个情况下的while循环,那么你可以解释一下它是O(n)和O(1)的情况。然后,我将了解这里到底发生了什么,然后乘以外环。for@icantcodewhile循环的最佳情况是a[j]
已经大于temp
。因此,循环将不会执行,而不执行的部分的时间复杂度是恒定的,即O(1)。@icantcode while循环的最坏情况是a[j]
永远不会大于temp
,因此循环将针对整个阵列运行,使其成为O(n)。