四種求最大子序列的演算法與分析(python描述)
阿新 • • 發佈:2018-12-10
目錄
演算法1——窮舉法
def method_of_exhaustion(lst):
length = len(lst)
this_sum = max_sum = 0
for i in range(length):
for j in range(i, length):
this_sum = 0
for k in range(i, length):
this_sum += lst[k]
if this_sum > max_sum:
max_sum = this_sum
return max_sum
第一種演算法是最容易也是最容易懂的一種演算法,演算法的核心思想很簡單,就是窮舉所有的可能解,然後通過比較返回最優解
演算法分析
第一層迴圈的索引i表示子序列左端的位置,第二層迴圈表示子列右端位置,第三層迴圈計算該子列的大小
從示意圖可以看到,i從0遍歷到length(陣列的長度),j從遍歷到length,在j的每一趟中,最內層迴圈都要從i到j計算一次子序列的大小,其實這是完全沒必要的,假設陣列a在i的某趟中,j + 1時的子序列的值為a[j] + a[j + 1],即j的前一個子序列的值加上當前索引j在陣列中的值。由此衍生出第二個演算法。
時間複雜度分析
1、直觀的看可以看到函式中有三個迴圈,所以時間複雜度為O( )。
2、精確的分析來看,該函式是由三重巢狀for迴圈組成的,最外層的迴圈次數為
,即陣列的長度。
第2個迴圈大小為
,它可能要小,但也可能是
。
我們必須假設最壞的情況,而這可能會使最終的界有些大。
第3個迴圈的大小為
我們也要假設它的大小為
。因此總數為
第2行和和3行總共的開銷只是
,而語句6和10也只不過總共開銷
,因為它們只是兩層迴圈內部的簡單表示式。
3、更精確的分析來看,考慮到這些迴圈的實際大小,更精確的分析指出答案是
,而在我們上面的估計高6倍(不過這並無大礙,因為常數不影響數量級)。一般來說,在這類問題中上述結論是正確的。精確的分析由和
得到,該“和”指出程式的第14行被執行多少次。首先有:
接著,得到
這個和是對前 個整數求和而計算得出的。為完成全部計算,我們有