陣列的連續最大子段合

2022-04-03 02:22:15 字數 1460 閱讀 8398

問題描述:輸入是乙個大小為n的整型陣列,要求輸出陣列的任何連續子陣列中的最大值。例如:輸入的陣列為array[10] = ;輸出最大連續子陣列和為array[2...6]:187

演算法1:對所有滿足0<=i<=j<=n的(i,j)整數對進行迭代,對每個整數對,程式都要計算array[i...j]的總和,並檢驗該總和是否大於迄今為止的最大總和。

演算法1的偽**描述如下:

maxsofar = 0

for(i=0;i這段**簡潔明瞭,便於理解,但是程式執行的速度很慢,時間複雜度為o(n^3)。

演算法2:對於演算法1有乙個明顯的方法可以使其執行起來快得多。使得時間複雜度控制住平方o(n^2)。

第乙個平方演算法注意到,array[i...j]的總和與前面計算出的總和(array[i...j-1])密切相關,利用這一點可以達到演算法2。

演算法2_1的偽**描述如下:

maxsofar = 0

for(i=0;i第二個平方演算法是引入乙個陣列curarray,大小也為n,通過空間來換取時間,通過訪問外迴圈執行之前計算[0...i]各個連續字段總和。curarrary中的第i個元素包含array[0...i]中各個數的累加和,所以x[i...j]中各個數的總和可以通過計算curarray[j] -curarray[i-1]得到.

演算法2_2的偽**描述如下:

curarray[-1] = 0

for(i=0;i演算法3:可以考慮採用法治演算法。初始問題是要處理大小為n的陣列,所以可以將其劃分為兩個子陣列a和b,然後遞迴的找出a、b中元素總和最大的子陣列分別為maxa、maxb。而最大子陣列要麼在a中,要麼在b中,要麼跨越a和b之間的邊界,我們將跨越邊界的最大子陣列記為maxc。我們通過分治演算法計算處了maxa和maxb,通過某種辦法計算處maxc。然後返回三個中的最大值就是我們所要的最大子陣列和。演算法的時間複雜度為o(nlogn)。如何計算maxc呢?通過觀察發現,maxc在a中的部分是a中包含右邊界的最大子陣列,而maxc在b中的部分是b中包含左邊界的最大子陣列。將這些綜合一起我們得到演算法3:

int maxsum3(1,n)

//求三個整數中的最大值

int max(const int x,const int y,const int z)

//演算法1函式實現

int maxsum1(int *array,const size_t len)

tempsum = 0;

for(int j=mid+1;j<=end;++j)

return max(lmax+rmax,maxsum3(array,begin,mid),maxsum3(array,mid+1,end));

} //演算法4的實現

int maxsum4(int *array,const size_t len)

}return 0;

}

陣列的連續最大子段和

轉至 anker s blog 問題描述 輸入是乙個大小為n的整型陣列,要求輸出陣列的任何連續子陣列中的最大值。例如 輸入的陣列為array 10 輸出最大連續子陣列和為array 2.6 187 演算法1 對所有滿足0 i j n的 i,j 整數對進行迭代,對每個整數對,程式都要計算array i...

陣列的連續最大子段和

最大子段和問題描述 給定由 n 個整數 可能為負整數 組成的序列a1,a2,a3.an,求該數列中連續子段和最大!例如 當 a1,a2,a3,a4,a5 2,11,4,13,5,2 時,最大欄位和為 20 11 4 13 以下例子都是以int data 6 int n 6 演算法一 對所有滿足0 i...

陣列的連續最大子段和

問題描述 輸入是乙個大小為n的整型陣列,要求輸出陣列的任何連續子陣列中的最大值。例如 輸入的陣列為array 10 輸出最大連續子陣列和為array 2.6 187 演算法1 對所有滿足0 i j n的 i,j 整數對進行迭代,對每個整數對,程式都要計算array i.j 的總和,並檢驗該總和是否大...