算术级数的复杂性是多少?

时间:2015-01-06 19:55:36

标签: algorithm math time-complexity

我真的不明白如何计算代码的复杂性。有人告诉我,我需要查看代码中每个项目的操作数量。所以,当我有一个循环遍历数组并基于算术级数的想法(我想计算从每个索引到数组末尾的总和),这意味着首先我通过n个单元格,第二次n -1个单元等等......为什么复杂性考虑为O(N ^ 2)而不是O(n)?

如我所见,n + n-1 + n-2 + n-c ..是xn -c,换句话说是O(n)。为什么我错了?

6 个答案:

答案 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 = 63(4)/2 = 12/2 = 6

n(n+1)/2 = (n^2 + n) / 2 O(n^2),因为我们可以删除常数因子和低阶项。