基本算法分析和求和表示法

时间:2011-09-19 00:55:30

标签: algorithm

因此,对于作业,我们必须计算一段代码中的步数。这是:

int sum = 0;
for (int i = 1; i <= n*n; i++)
   for (int j = 1; j <= i; j++)
      for (int k = 1; k <= 6; k++)
          sum++;

我的教授(我认为)解释说,第二行中的操作数量可以使用求和符号找到,如下所示:

n^2
Σ   x 4 + 3 
i=1

这将是1/2(n ^ 4 + n ^ 2)x 4 + 3 = 2n ^ 4 + 2n ^ 2 + 3

但是从我看来,我认为它会像4n ^ 4 + 2(我的教授说4n ^ 4 + 3,我不知道第三次操作在哪里......)

我在这里做错误符号吗?对于我来说,对嵌套for循环进行求和表示法是有道理的,但我不知道为什么它本身可以用于for循环。

感谢。

3 个答案:

答案 0 :(得分:8)

实际上即使你的教授结果也是错误的。确切的结果是3n^4+3n^2

要获得该结果,只需考虑:

enter image description here

所有段落都非常简单(如果你考虑第一个n自然数之和的公式,那么从第4步到第5步的过程是立竿见影的。

答案 1 :(得分:1)

我猜你和你的教授都错了。根据我的计算(我可能也错了)它应该是 3n^4+3n^2

最外面的循环将运行n ^ 2次。考虑到这一点,内部循环将在第一次迭代中运行1次,依此类推直到n^2。即来自j=1 to j=1,2,3,4 ... n^2。如果我们对系列(1+2+3...n^2)求和,则会变为(n^2(n^2+1))/2

因此,对于外部循环的n ^ 2次迭代,内部循环将执行(n^2(n^2+1))/2次。对于第二个循环的每次迭代,最内部循环执行六次。因此,只需将(n^2(n^2+1))/2与6相乘,即可评估为 3n^4+3n^2

要查看答案,我们举个例子。说n=5,运行你的算法并输出这将给1950年的总和。现在在评估的表达式中替换这个值,这将类似3(5^4)+3(5^2),并再次评估为1950

答案 2 :(得分:-1)

您需要计算的是:

S = sum(i in 1..n^2) sum(j in 1..i) sum(k in 1..6) 1

现在,最里面的总和显然是6,因此我们有

S = sum(i in 1..n^2) sum(j in 1..i) 6
  = 6 sum(i in 1..n^2) sum(j in 1..i) 1

最里面的总和只是前i个数字的总和,你应该知道它是i(i + 1)/2,给出

S = 6 sum(i in 1..n^2) i(i + 1)/2
  = 3 sum(i in 1..n^2) i(i + 1)
  = 3 sum(i in 1..n^2) (i^2 + i)

我们可以将其分为两个部分:

S = 3 [ (sum(i in 1..n^2) i^2) + (sum(i in 1..n^2) i) ]

第二个数字只是我们的老朋友,第一个n ^ 2数字的总和,所以扩展很容易。

第一个总和有一个新朋友,第一个n ^ 2个方格的总和。如果您手边不知道,可以谷歌。

放入公式,展开一点,用扫帚整理,你应该得到答案。

干杯!