最大子串行之和問題
這個問題非常有趣,因為有很多中演算法可以解決這個問題。而這些演算法的執行效率也多種多樣。
下面我們將看到四種演算法,演算法複雜度從指數一直過渡到線性複雜度。
充分體現了演算法的優劣對執行效率的影響。
第一種**:
intmaxsubsum1( const vector & a )
return maxsum;
}這個演算法很簡單,
i表示子串行起始下標,
j表示子串行結束下標,遍歷子串行的開頭和結束下標,計算子串行的和,然後判斷最大子串行。很明顯的看出演算法複雜度是
o( pow( n, 3 ) )
第二種演算法
**:intmaxsubsum2( const vector & a )
} return maxsum;
}與第一種很相似,省去了選結束下標的迴圈語句,演算法複雜度是
o( pow( n, 2 ) )
第三種
採用了遞迴的「分而治之」
( divide-and-conquer )
的思想。
比如4 -3 5 -2 -1 2 6 -2
first second
把序列分為兩部分,那麼最長子序列要麼在
first
,要麼在
second
,要麼就既在
first
又在second
。第一中情況只要求
first
的最大子串行(遞迴呼叫),第二中情況只要求
second
的最大子串行(還是遞迴呼叫)。對於第三種情況,只要找到包含
first
最後乙個元素(在例子中是2)在
first
的最大子串行(例子中是4,
-3,5,
-2)和包含
second
起始元素(
-1)在
second
的最大子串行(-1,
2,6)然後相加就行了。
這種演算法的複雜度計算和計算斐波那契數列的複雜度相似,設
n 個數的執行次數是
t( n )
,那麼t( n ) = 2*t( n/2 ) + o( n )
其中t( 1 ) = 1
o( n )
可以看成
n ,那麼可以觀察得到
t( n ) = n * logn
intmaxsumrec( const vector & a, int left, int right )
int maxrightbordersum = 0, rightbordersum = 0;
for ( int i = center; i <= right; i++ )
return max3( maxleftsum, maxrightsum, maxleftsum + maxrightsum ); //
判斷三個數最大值的函式
}int
maxsubsum3( const vector & a )
第四種演算法
**:intmaxsubsum( vector & a )
return maxsum;
}非常短,而且一眼就看出演算法複雜度是
o( n )
級別的。
我們用i
表示子串行的起始下標,
j 表示子串行的終止下標。
原理是,當我們得到乙個子串行,如果子串行的第乙個數是非正數,那麼可以捨去,即
i++當乙個子串行的前
n個元素和為非正數時,是否也可以捨去呢?答案是可以的。
假設k 是i
到j中任意乙個下標。
sum( a, b )
表示子串行第
a個元素到第
b個元素之和。由於加到第
j個元素,子串行才開始為負數,所以
sum( i, k ) > 0
,sum( i, k ) + sum( k, j ) = sum( i, j ) ,
所以sum( k, j ) < sum( i, j ) < 0
所以如果把k到
j的序列附加到
j之後的序列上,只會使序列越來越小。所以i到
j的序列都可以捨去。
這個演算法的另外乙個優勢就是程式是一邊讀取一邊處理資料,
a[ i ]
的值不需要被記住,也就是說不需要把數列的一部分儲存在記憶體中。如果數列是儲存在磁碟上,或者是在網路中傳播就可以按順序處理。在任何時候,這個演算法都可以根據收到的資料給出結果。有這種特點的演算法叫做
on-line
演算法。
求最大子串行之和
摘要 給出乙個序列,求出其中連續的子串行中和最大的乙個。如 1 3 5 2 1 4 5 最大子串行之和是2 1 4 5 基本思路 最簡單的辦法就是遍歷一邊序列,用變數thissum記錄遍歷過的元素之和,當thisum 0時,繼續相加.若thisum 0,令thisum 0,吧下乙個元素作為新的子串行...
求最大子串行之和
今天一下午在看sharepoint了,又有活幹,所以時間比較緊湊,於是想起了前些日子寫的求最大子串行之和,作為每日一小題吧,暫做自我安慰吧。求最大子串行之和,主要要注意他的效率,1,演算法複雜度是o pow n,2 int max sub int a,int size return max 2,演算...
陣列的最大子串行之和
問題描述 求最大子串行之和一直是讓人困擾的問題,之所以困擾,主要是由於沒有想清楚該怎樣操作,下面給出一種最暴力的求解方法,利用多重迴圈來求解最大子串行和,每次對給定子序列求和,把它與剛開始設定的最大值進行計較,如果它大於設定的最大值,將它設定為最大值,記錄最大值的初始位置和終端位置,然後輸出就是最大...