问题描述
我一直在努力分析算法和数据结构作业。有了COVID-19和在线学习,就很难了!特别是因为我的教科书被拖延了:(。我想知道是否有任何一种灵魂可以帮助我分析这些O(n)问题。
我基本上理解它,但是在计算循环中的原始操作(例如for(i = 0; i
无论如何,我将它们放在下面。我会把我的有根据的猜测放在下面,顺便说一句。对我来说,最大的部分就是了解原始操作。即使我具有正确的复杂性,我仍然很难从数学上得出该解决方案。非常感谢您!
// #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++;
解决方法
简单地说,时间复杂度是指代码在更改输入时将花费多少时间,并以n(输入大小)为单位。
// #1 O(n)
sum = 0;
for( 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++;
这里,外循环运行2n次,每2n次内循环将运行i次。如果计算不同n值的运算,您将看到循环运行更改的次数为n ^ 2,而不仅仅是n。 因此该时间复杂度为O(n ^ 2)。
// #3 O(n^4)
sum = 0;
for( i = 0; i < n2; i++)
for( j = 0; j < i; j++)
sum++;
这里,外循环运行n ^ 2次,每个外循环内循环将运行i次(平均为n ^ 2)。因此,外部n ^ 2 X内部n ^ 2为n ^ 4。因此时间复杂度为O(n ^ 4)。
// #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++;
第一个循环运行n次,第二个循环平均运行n ^ 2次(i i为n n),第三个循环平均运行n ^ 2次(j将保持由于第二个循环,n ^ 2个差异值)。因此总时间复杂度将为O(n x n ^ 2 x n ^ 2)= O(n ^ 5)
,分析时间复杂度时,可以忽略n之前的所有数字,例如2n与n相同。因为当n无限大时,2等于1。(这也是分析O()复杂度时的重点)
以#4为例,i只是O(n),j是O(n ^ 2),k也是o(n ^ 2)。则总复杂度将是所有这些乘积的乘积,答案将是O(n ^ 5)。另一个例子#2,我只是O(n),与j相同,则答案是O(n ^ 2)
,尝试从最内部的循环开始预测每个循环如何sum
发生变化。您应该能够以这种方式得出精确的表达。例如。对于您的第二个示例(我添加了一个显式的乘法标记,希望这里是正确的解释):
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;
这很简单。有i
个迭代,每个sum
递增1,因此完整的循环可以由sum += i
代替。外循环有点棘手。我们将所有从0到2 * n
的整数求和,所以
sum += 0 + 1 + 2 + ... + 2 * n - 1 + 2 * n
现在有一个众所周知的公式(或者只使用google或wolframalpha,它们都足以为像这样的简单情况找到封闭式)
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)