1. 程式人生 > >四種求最大子序列的演算法與分析(python描述)

四種求最大子序列的演算法與分析(python描述)

目錄

演算法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( N 3 )。

2、精確的分析來看,該函式是由三重巢狀for迴圈組成的,最外層的迴圈次數為 N = l e n g t h ,即陣列的長度。
第2個迴圈大小為 N i ,它可能要小,但也可能是 N

我們必須假設最壞的情況,而這可能會使最終的界有些大。

第3個迴圈的大小為 j i + 1 我們也要假設它的大小為 N 。因此總數為 O ( 1 · N · N · N ) = O ( N 3 )
第2行和和3行總共的開銷只是 O ( 1 ) ,而語句6和10也只不過總共開銷 O ( N 2 ) ,因為它們只是兩層迴圈內部的簡單表示式。

3、更精確的分析來看,考慮到這些迴圈的實際大小,更精確的分析指出答案是 Θ ( N 3 ) ,而在我們上面的估計高6倍(不過這並無大礙,因為常數不影響數量級)。一般來說,在這類問題中上述結論是正確的。精確的分析由和 i = 0 N 1 j = i N 1 k = i j 1 得到,該“和”指出程式的第14行被執行多少次。首先有:

k = i j 1 = j i + 1
接著,得到
j = i N 1 ( j i + 1 ) = ( N i + 1 ) ( N i ) 2
這個和是對前 N i 個整數求和而計算得出的。為完成全部計算,我們有
i = 0 N 1 ( N i + 1 ) ( N i ) 2 = i = 1 N ( N i + 1 ) ( N i + 2 ) 2
= 1 2 i = 1 N i 2 ( N + 3 2 ) i = 1 N i + 1 2 ( N 2 + 3 N + 2 ) i = 1 N 1
= 1 2 N ( N + 1 ) ( 2 N + 1 ) 6 ( N + 3 2 ) N ( N + 1 ) 2 + N 2 + 3 N + 2 2 N
=