我有一个算法,我试图找出解决最大子阵列总和问题的算法的最佳情况(渐近符号):
-- Pseudocode --
// Input: An n-element array A of numbers, indexed from 1 to n.
// Output: The maximum subarray sum of Array A.
Algorithm MaxSubSlow(A):
m = 0.
for j = 1 to n do:
for k = j to n do:
s = 0
for i = j to k do:
s = s + A[i]
if s > m then:
m = s
return m
查看算法,使用渐近符号数学,很容易确定最坏情况(每个循环运行,在最坏的情况下,运行n次),因此最坏情况的复杂性类将是O(N ^ 3) )。
然而,我的教科书指出这个算法也运行在Big-Omega(N ^ 3)时间;也就是说,下限等于其上限。但是,它没有解释为什么。
您将如何正式计算并证明这一点?你是否必须证明对于算法,有一个数字子集(i,j,k),使得算法中的每个循环至少运行n次?如果是这样,你怎么做?
答案 0 :(得分:0)
直观地说,即使您更改保持相同大小n
的输入,它也会执行相同数量的操作:操作次数仅取决于输入大小,而不是特定输入。因此,最佳和最差情况都是相同的。
o()的计算与本例中的O()完全相同