这个程序的确切复杂性是什么?

时间:2013-02-06 17:29:07

标签: algorithm complexity-theory

有人给我这段代码,我想要找到确切的复杂性,换句话说,找到一个公式,让特定的n知道如何计算L.

L = 0;
for (i = 1; i<n; i++)
    for (j = 1; j<i; j++)
        for (k = j; k<n; k++)
            L++;

我的第一个想法是(n ^ 3 + n ^ 2)/ 2,但是错了。

例如n = 5 L = 20;             n = 10L = 240

谢谢:D

编辑: 此问题来自基础算法,第140页或pdf中的幻灯片161(这是免费书籍版本) http://www.freebookspot.es/Comments.aspx?Element_ID=76025

1 个答案:

答案 0 :(得分:2)

这是数学,而不是编程。

L等于(S是大西格玛,总和):

    n-1   i-1   n-1
   S     S     S    1
   i=1   j=1   k=j

   n-1 i-1
= S   S  (n - j)
  i=1 j=1

   n-1 i-1      n-1 i-1
= S   S  n  -  S   S  j
  i=1 j=1      i=1 j=1 

       n-1          n-1 
= n * S   (i-1) -  S   (i-1)i/2
      i=1          i=1

等等。您需要知道第一个n整数的总和为n(n+1)/2,并且第一个n正方形的总和为n(n+1)(2n+1)/6。你最终会在n中得到一个三次方程式。

感谢Barmaley的回答指出我不再是本科生,我不必操纵公式来简化它们。 Wolfram Alpha会为我做的; - )

答案是n(n-1)(n-2)/3。通常情况下,当这些事情很好地分解时,事实证明,我可以在早期做出一个关键的洞察力(可能是几何的洞察力),以便在不写太多长表达的情况下得到答案。这个结果看起来很可疑,就像刻在长方体上的金字塔体积有nn-1n-2