Algorithm 带if-else块的for循环的时间复杂度
我想找出下面代码的时间复杂度。这是我的理解- 外部for循环将循环Algorithm 带if-else块的for循环的时间复杂度,algorithm,loops,time-complexity,big-o,Algorithm,Loops,Time Complexity,Big O,我想找出下面代码的时间复杂度。这是我的理解- 外部for循环将循环2n次,在最坏的情况下,当i==n时,我们将进入if块,其中嵌套for循环的复杂度为O(n^2),计算外部for循环,代码块的时间复杂度将为O(n^3) 在最佳情况下,i=n,else的复杂性为O(n),外部for循环为O(n),这使得复杂性在最佳情况下为O(n^2) 我是对的还是我遗漏了什么 for(int i=0;i
2n次,在最坏的情况下,当i==n
时,我们将进入if块,其中嵌套for循环的复杂度为O(n^2)
,计算外部for循环,代码块的时间复杂度将为O(n^3)
在最佳情况下,i=n
,else的复杂性为O(n)
,外部for循环为O(n)
,这使得复杂性在最佳情况下为O(n^2)
我是对的还是我遗漏了什么
for(int i=0;i<2*n;i++)
{
如果(i==n)
{
对于(int j=0;j
否
“T(n)是什么?”这个问题。
你说的是“如果i=n,那么O(n^3),否则O(n^2)”。
但问题中没有i,只有n
想一想类似的问题:
“在一周内,皮特周三工作10小时,每隔一天工作1小时,皮特一周的总工作时间是多少?”。
你不会真的回答“如果一周是星期三,那么X,否则Y”。
你的答案必须包括周三和每隔一天的工作时间
回到你原来的问题,周三是i=n的时候,其他日子都是i=n的时候=N
我们必须把它们全部加起来才能找到答案。基于@Gassa answer,让我们总结一下:
O(n^3)+O((2n)^2)=O(n^3)+O(4n^2)=O(n^3)+4*O(n^2)=O(n^3)
大O表示法允许我们抛出4*O(n^2),因为O(n^3)“吃”了它这是一个每个循环执行O(1)多少次的问题。时间复杂度是n
的函数,而不是i
。也就是说,“O(1)在n
执行多少次?”
- 当
i==n
时,有一次运行O(n^2)
循环
- 在所有其他情况下,都有
(2n-2)
O(n)
循环的实例
因此,时间复杂度是O((2n-2)*n+1*n^2)
=O(3n^2-2*n)
=O(n^2)
我已经编写了一个C程序,用来输出n^2的前几个值,即实际值,以及n^3来说明差异:
#包括
整数计数(整数n){
int ctr=0;
对于(int i=0;i<2*n;i++){
如果(i==n)
对于(int j=0;j对于(int i=1;i第一个循环重复2*n
次:
for (int i = 0; i < 2*n; i++)
{
// some code
}
这部分取决于i
else
{
for (int j = 0; j < i; j++)
O(1)
}
else
{
对于(int j=0;j
考虑i
when:
i=0
循环重复0
次
i=1
循环重复1
次
i=2
循环重复2次
.
.
i=n
循环重复n
次。(n这里是2*n)
因此循环重复了(n*(n+1))/2次
,但当i==n
其他部分不工作时,则(n*(n+1))/2-n
时间复杂度为O(n^2)
现在我们把所有这些部分加起来:O(n^2)(第一部分)+O(n^2)(第二部分)
因为第一部分只出现一次,所以它不是O(n^3)
时间平面性是:O(n^2)
它不应该是O(n^2)
因为if条件中的两个循环只执行一次吗?@AKSingh是的,对于增加n,O(n^2)
很快就会接管。@calculuswizO(n^2)
不会支配O(n^3)
用于增加n。我想你的意思是说,如果两个循环在另一个循环中只执行一次n
次,那么它们不会对外部循环的整体复杂性产生重大影响。@AKSingh是的,这不清楚。对不起。是的,我的错一定是O(n^2)+O((2n)^2)=5*O(n^2)谢谢,伙计。很好的例子。对不起,我对你和@Gassa的答案感到困惑。@Vatsalrajaguru我想我们都在说最好和最坏的情况取决于I
在这种情况下不适用。所以你说答案是O(n^3),因为我们取的是最高学位。对吗?O(n^3)当i==n时只发生过一次。@Vatsalrajaguru这种分析是不正确的/不完整的。a)O(n^3+n^2)
仍然是O(n^3)
,b)这里根本没有发生O(n^3)
正是因为循环发生过一次。我在这里已经给出了正确的分析:。我编写的程序清楚地演示了二次循环(O(n^2)
)增长。@calculus是的,我犯了一个错误,我要编辑它。谢谢。
else
{
for (int j = 0; j < i; j++)
O(1)
}