运行时分析,三个内循环

时间:2013-03-07 21:17:11

标签: performance algorithm analysis pseudocode

这是我的第一个问题,我很确定我也会得到第一个答案:P

我必须对一个算法进行渐近分析,该算法从数组A[1...n]计算一个矩阵M[n][n],其中包含每个M[i][j]一个由下式给出的值:

M[i][j] = (A[i] + ... + A[j])/(j-i+1), if i<=j

M[i][j] = 0, if i>j

for i=1 to N do                [N]
   for j=1 to N do             [N]
    if(i<=j)                   [cost]
      start=i                  [cost]
      end=j                    [cost]
      sum=0                    [cost]
      for a=start to end do    [??]
         sum += A[a]           [cost]
      M[i][j]=sum/(j-i+1       [cost]
    else                       [cost]
      M[i][j]=0                [cost]

考虑到给出前两个for循环我必须期望至少一个O(n ^ 2)的运行时间,第三个内部for循环我会得到像O(N * N * [??]) 。 第三个for循环每次执行j-i + 1次操作,并且只对i <= j执行。 矩阵将第一行填充计算平均值,第二行填充计算平均值,然后计算平均值...

最终矩阵将导致几乎一半填充(但不是N / 2)所以第三个循环的值不是[N / 2]

如何计算最内层For的运行时间以及整个算法的运行时间?

1 个答案:

答案 0 :(得分:0)

您可以尝试计算内部循环语句执行的次数。

你将i从1循环到N.现在,当j大于或等于N时,你只会做内循环(带和)所以j从i循环到N.最内层的循环则由ji组成补充。总而言之(枫语法)

sum(sum(j-i,j=i..N), i=1..N)= 1/6*N^3-1/6*N

然后你需要考虑M [i] [j]的分配,这个分配完成了N ^ 2次。

之前是指示总数。但是,如果您只是在寻找总体复杂性,那么您应该看到内部循环依赖于N,这会给您带来O(N ^ 3)的整体复杂性。

请注意,代码可以通过从开头存储A [i]总和来避免内部循环复杂性,并且不会每次都尝试重新计算它们