4

我需要将 for 循环转换为总和国家的帮助。其中一些很容易,但另一些则有点棘手。我需要正确设置和符号。

像这样:(正确的例如循环)

图片

举个例子:

for (int i = 0; i < n; i = i + 1)  
  a = i; //cost 1

总和 1,i=0 到 n-1 == n。

我需要以下帮助:

对数(只是正确的和符号)

for (int i = 0; i < n; i = 2 * i)  
  a = i; //cost 1

总和 1,i=0 到 log(n)-1 == log n。正确的??

三重嵌套(求和表示法和一步一步为什么它最终喜欢它)

for (int i = 0; i < n; i = i + 1)  
for (int j = 0; j <= i; j = j + 1)  
for (int k = 0; k <= j; k = k + 1)  
  a=i; //cost 1

图片

4

3 回答 3

1

三重嵌套循环


我将给出一个简单但非常有用的方法来根据渐近符号分析此类求和。

这是一种非常通用的方法,您可以使用它来绑定许多多个索引总和,而无需付出很大的努力。

上限

首先,让我们推导出总和的上限。这很容易:

在此处输入图像描述

下限

在这种情况下,诀窍是推导出下限。经验法则是减小求和范围,将下求和索引递增到上索引的分数,然后将新的下索引替换为嵌套循环中的上索引。这也很容易:

在此处输入图像描述

把它放在一起

从这两个不等式中,您可以推断出:

在此处输入图像描述

就渐近分析而言,它给出:

在此处输入图像描述

如您所见,您的三重嵌套循环具有与以下相同的渐近时间复杂度:

for(int i = 0; i < n; i = i + 1)  
   for(int j = 0; j < n; j = j + 1)  
      for(int k = 0; k < n; k = k + 1)  
         //operations of cost 1
于 2013-08-13T23:52:03.843 回答
1

对于对数循环:

首先,在处理对数循环时,您不能将索引初始化为零。

其次,以下是使用 Sigma 符号表示算法循环的方式:

在此处输入图像描述

请看Jauhar 博士的这份文件的最后一张幻灯片。

对于三个嵌套循环:

在此处输入图像描述

Mark Allen Weiss 的工作可能对您有很大帮助。请参阅此链接

于 2014-03-14T04:05:11.210 回答
0

对数

第二个 for 循环永远不会停止 ( 0 * 2 = 0)。我猜,你问的是这个循环:

for (int i = 1; i < n; i = 2 * i)  
  a = i; //cost 1

在这种情况下,通过求和符号表示的复杂性将是:

总和 1,i=1 到 log(n-1) == O(log n)

三重嵌套

在这种情况下,它将是以下各项的总和:

 number of steps                 sum
 --------------------------------------
 1   1   1   1   1   1   .       n
 2   2   2   2   2   .           2(n-1)
 3   3   3   3   .               3(n-2)
 4   4   4   .                   4(n-3)
 .   .   .                       .
n-1 n-1                          2(n-1)
 n                               n

或者,如果我转置三角形:

 number of steps                 sum
 --------------------------------------
 1   2   3   4   .  n-1   n      n(n+1)/2 
 1   2   3   4   .  n-1          (n-1)(n)/2
 1   2   3   4   .               (n-2)(n-1)/2
 1   2   3   .                   4(n-3)
 1   2   .                       .
 1   .                           3
 .                               1

右侧的数字(在第二个三角形中)也称为三角形数字。所以这个问题相当于

"小于或等于 f(n) 的三角形数之和是多少。(f(1) + f(2) + f(n),其中 f(x) = x(x+1)/2)

这个问题的答案是

f(n) = n(n+1)(n+2)/6

证据就在这里

所以 big-o 的结果复杂度是O(n^3)

于 2013-08-13T21:39:19.063 回答