我真的不明白如何计算代码的复杂性。有人告诉我,我需要查看代码中每个项目的操作数量。所以,当我有一个循环遍历数组并基于算术级数的想法(我想计算从每个索引到数组末尾的总和),这意味着首先我通过n个单元格,第二次n -1个单元等等......为什么复杂性考虑为O(N ^ 2)而不是O(n)?
如我所见,n + n-1 + n-2 + n-c ..是xn -c,换句话说是O(n)。为什么我错了?
答案 0 :(得分:4)
如我所见,n + n-1 + n-2 + n-c ..是xn -c,换句话说是O(n)。为什么我错了?
实际上,事实并非如此。该算术级数的总和是n *(n-1)/ 2 = O(n ^ 2)
P.S我已经阅读了你的任务:使用之前的结果你只需要一个数组上的循环,所以你可以用O(n)复杂度来解决这个问题。
for i=1 to n
result[i] = a[i]+result[i-1]
答案 1 :(得分:1)
您的代码告诉您要做的事情如下: -
traverse array from 1 to n
traverse array from 2 to n
... similarly after total n-1 iterations
traverse array's nth element
正如您所注意到的那样,单元格的遍历正在按1的顺序递减。
每个遍历都由循环引导,循环增加到i的值。整个代码包含在n。
的函数下对阵列 的每个项目执行的操作数量的具体想法是: -
for ( i = 1 to n )
for ( j = i to n )
traverse array[j] ;
因此,您的代码的复杂性= O(n ^ 2)并且顺序显然在AP中,因为它形成了系列n +(n-1)+ ... + 1,其公差为1。
我希望很清楚......
答案 2 :(得分:0)
由于算术级数具有闭式解,因此其有效计算为o(1):即计算时间不依赖于元素数。
如果你要使用循环那么它将是o(n),因为执行时间对于元素数量是线性的。
答案 3 :(得分:0)
您将n个数字相加,其平均值为(n / 2),因为它们的范围从1到n。因此n次(n / 2)= n ^ 2 / 2.我们不关心常数倍,所以O(n ^ 2)。
答案 4 :(得分:0)
你在某处弄错了!算术级数的总和是n ^ {2}
的量级要清除您对算术级别的疑虑,请访问以下链接:http://www.mathsisfun.com/algebra/sequences-sums-arithmetic.html
正如你所说,你很难找到任何代码的复杂性,你可以从这两个链接中读取:
http://discrete.gr/complexity/
http://www.cs.cmu.edu/~adamchik/15-121/lectures/Algorithmic%20Complexity/complexity.html
足以帮助您了解如何找到大多数算法的复杂性。
答案 5 :(得分:0)
时间复杂度为:1 + 2 + ... + n
。
这等于n(n+1)/2
。
例如,对于n = 3:1 + 2 + 3 = 6
和3(4)/2 = 12/2 = 6
n(n+1)/2 = (n^2 + n) / 2
O(n^2)
,因为我们可以删除常数因子和低阶项。