最大子串行之和問題

2021-04-28 14:18:58 字數 2368 閱讀 8487

最大子串行之和問題

這個問題非常有趣,因為有很多中演算法可以解決這個問題。而這些演算法的執行效率也多種多樣。

下面我們將看到四種演算法,演算法複雜度從指數一直過渡到線性複雜度。

充分體現了演算法的優劣對執行效率的影響。

第一種**:

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,演算...

陣列的最大子串行之和

問題描述 求最大子串行之和一直是讓人困擾的問題,之所以困擾,主要是由於沒有想清楚該怎樣操作,下面給出一種最暴力的求解方法,利用多重迴圈來求解最大子串行和,每次對給定子序列求和,把它與剛開始設定的最大值進行計較,如果它大於設定的最大值,將它設定為最大值,記錄最大值的初始位置和終端位置,然後輸出就是最大...