最大連續子串行

2021-07-10 01:14:17 字數 1285 閱讀 7103

問題描述:

已知序列 a[0]、a[1]、a[2]、…、a[n],要求出連續子串行a[i]、a[i+1]、a[i+2]、…、a[j](0<=i<=j<=n),使其和最大。

演算法1:暴力列舉,簡單,但是效率不高。由於有三層迴圈,故時間複雜度為o(n^3)。

max=a[0];//max不能為0

for(i=0;i<=n;i++)

if(sum>max)

max=sum;

}}

演算法2:列舉演算法優化。設s[i]=a[0]+a[1]+a[2]+…+a[i],則a[i]+a[i+1]+a[i+2]+…+a[j]=s[j]-s[i-1]。主要的時間消耗在二層迴圈中,故時間複雜度為o(n^2)。

s[0]=a[0];

for(i=1;i<=n;i++)

s[i]=s[i-1]+a[i];

max=a[0];

for(j=0;j<=n;j++)//起點為0的序列

for(i=1;i<=n;i++)

}

演算法3:遞迴分治

遞迴分治的一般思路:

(1)將原問題劃分成若干子問題。

(2)遞迴求解子問題。

(3)將子問題合併,求得原問題的解。

最大連續子串行的遞迴分治演算法:

(1)劃分問題:將子串行劃分成長度大致相等的左右兩部分。

(2)求解子問題:分別求解左、右子串行的最優解。

(3)合併問題:最大連續子串行的解只可能有以下三種情況:只在左半部分、只在右半部分、「橫跨」左右兩大部分(即起點位於左半部分、終點位於右半部分)。在第二步中已經求出了左、右兩部分的最優解了,在此,只需求出起點在左半部分、終點在右半部分的最大子串行,並把它和左半部分、右半部分的最大解作比較,求出最大解。

時間複雜度分析:t(n)=2*t(n/2)+o(n),t(1)=1.

2*t(n/2)是因為將原問題分成兩個長度大致相同的左右兩部分。

o(n)是因為合併時掃瞄整個序列。

t(n)=2*t(n/2)+n

=4*t(n/4)+2n

=8*t(n/8)+3n

=16*t(n/16)+4n

…. =n*t(1)+nlogn(以2為底)

=o(nlogn)

故時間複雜度為o(nlogn).

//求[x,y]的最大連續子串行和,返回值即為最大連續子串行和

int maxsum(int *a,int x,int y)

最大連續子串行之和,最大連續子串行乘積

最大連續子串行之和問題描述為 陣列中里有正數也有負數,連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。分析,對陣列a進行一遍掃瞄,sum i 為前i個元素中,包含第i個元素且和最大的連續子陣列,maxsum儲存當前子陣列中最大和,對於a i 1 來說,sum i ...

最大連續子串行

e 最大連續子串行 description 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加乙個要求,即還需要輸出該 子串行...

最大連續子串行

給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加乙個要求,即還需要輸出該 子串行的第乙個和最後乙個元素。input 測試輸入...