这是我的第一个问题,我很确定我也会得到第一个答案: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的运行时间以及整个算法的运行时间?
答案 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]总和来避免内部循环复杂性,并且不会每次都尝试重新计算它们