Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 带if-else块的for循环的时间复杂度_Algorithm_Loops_Time Complexity_Big O - Fatal编程技术网

Algorithm 带if-else块的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

我想找出下面代码的时间复杂度。这是我的理解-

外部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<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)
很快就会接管。@calculuswiz
O(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)
}