Algorithm 需要帮助分析O(n)复杂性吗

Algorithm 需要帮助分析O(n)复杂性吗,algorithm,time-complexity,big-o,space-complexity,notation,Algorithm,Time Complexity,Big O,Space Complexity,Notation,我一直在努力完成我的算法和数据结构分析作业。有了新冠病毒-19和电子学习,这很难!特别是因为我的课本被推迟订购:(。我想知道是否有善良的灵魂可以帮助我分析这些O(n)问题 我基本上理解它,但我在计算循环上的基本操作时遇到了很大困难,例如for(I=0;I

我一直在努力完成我的算法和数据结构分析作业。有了新冠病毒-19和电子学习,这很难!特别是因为我的课本被推迟订购:(。我想知道是否有善良的灵魂可以帮助我分析这些O(n)问题

我基本上理解它,但我在计算循环上的基本操作时遇到了很大困难,例如for(I=0;I<2n;I++)

无论如何,我会把它们放在下面。顺便说一句,我会把我受过教育的猜测放在下面。对我来说,最大的部分就是理解原始运算。即使我得到了正确的复杂性,我仍然在数学上努力得出那个解。非常感谢你

// #1 O(n)
sum = 0;
for( i = 0; i < 2n; i++ )
      sum++;
/#1 O(n)
总和=0;
对于(i=0;i<2n;i++)
sum++;
/#2o(n^2)
总和=0;
对于(i=0;i<2n;i++)
对于(j=0;j
/#3 O(n^4)
总和=0;
对于(i=0;i
/#4 O(n^5)
总和=0;
对于(i=0;i
在分析时间复杂度时,可以忽略n之前的所有数字,例如2n与n完全相同。因为当n变得无限大时,2与1完全相同。(这也是分析O()复杂度时的一个重要点)


以#4为例,i就是O(n),j就是O(n^2),k也是O(n^2)。那么总的复杂度将是它们的乘积,答案将是O(n^5)。另一个例子#2,i就是O(n),与j相同,那么答案是O(n^2)

试着从最里面的循环开始预测每个循环如何变化
sum
。这样你应该能够得到一个精确的表达式。例如,对于第二个示例(我添加了一个显式乘法标记,希望这是正确的解释):

现在有一个众所周知的公式(或者只使用google或wolframalpha,这两种方法都足以为像这样的简单情况找到闭合公式)

使用此功能,我们现在还可以减少外部循环:

sum = 0
sum += 2 * n * (2 * n + 1) / 2 = 2*n^2 + n
现在需要做的就是从表达式中删除所有低阶项和系数:

sum = 2 * n^2 + n = O(n^2)

简单地说,时间复杂度是指当我们改变输入时,我们的代码将花费多少时间,并用n(输入大小)来衡量

/#1 O(n)
总和=0;
对于(i=0;i<2n;i++)
sum++;
这个循环的时间复杂度是O(n),因为您只是在运行1个循环。如果n值是10,它将运行20次,如果n值是20,它将运行40次,以此类推。虽然时间复杂度随着2n的增加而增加,但我们放弃该常数,并说时间复杂度是O(n),即时间复杂度将相对于n线性变化

// #2 O(n^2)
sum = 0;
for( i = 0; i < 2n; i++ )
    for( j = 0; j < i; j++ )
         sum++;
/#2o(n^2)
总和=0;
对于(i=0;i<2n;i++)
对于(j=0;j
在这里,外循环运行2n次,对于每2n次,内循环将运行i次。如果您计算不同n值的操作,您将看到循环运行次数变化n^2,而不仅仅是n。 所以这个时间复杂度是O(n^2)

/#3 O(n^4)
总和=0;
对于(i=0;i
这里out循环运行n^2次,对于每个外部循环,内部循环将运行i次(平均为n^2)。因此外部n^2 X内部n^2是n^4。因此时间复杂度是O(n^4)

/#4 O(n^5)
总和=0;
对于(i=0;i

第一个循环运行n次,第二个循环平均运行n^2次(ii为nn),第三个循环平均运行n^2次(由于第二个循环,j将保持n^2个差异值)。因此总时间复杂度将为O(n x n^2 x n^2)=O(n^5)

我想
2n
意味着
2*n
n2
意味着
n*n
…对吗?另请参见:
sum = 0;
for( i = 0; i <  in pretty much the same way, except for the different series.2 * n; i++ )
    for( j = 0; j < i; j++ )
        sum++;
sum = 0;
for(i = 0; i < 2 * n; i++)
    sum += i;
sum += 0 + 1 + 2 + ... + 2 * n - 1 + 2 * n
1 + 2 + ... + n = n * (n + 1) / 2
sum = 0
sum += 2 * n * (2 * n + 1) / 2 = 2*n^2 + n
sum = 2 * n^2 + n = O(n^2)
// #1 O(n)
sum = 0;
for( i = 0; i < 2n; i++ )
      sum++;
// #2 O(n^2)
sum = 0;
for( i = 0; i < 2n; i++ )
    for( j = 0; j < i; j++ )
         sum++;
// #3 O(n^4)
sum = 0;
for( i = 0; i < n2; i++)
    for( j = 0; j <  i; j++)
          sum++;
// #4 O(n^5)
sum = 0;
for( i = 0; i < n; i++)
   for( j = 0; j <  i*i; j++)
      for( k = 0; k <  j; k++)
          sum++;