問題描述:存在序列A[1...n],序列中元素的值域為整數。求解序列A中子序列A[p,...,q]的元素和為最大值子序列?
解決思路 : 設m為↓[(1+n)/2]向下取整的即中點,則A最大值子序列在是下面序列中最大值子序列中之一
A[1,...,m](中點左側 包括中點)
A[i,...,j] 其中1 <= i <= m < j <= n (橫跨中點)
A[m+1,n](中點右側 不包括中點)
這樣將求A最大值子序列問題轉移求A[1,...,m]、A[i,...,j] 其中1 <= i <= m < j <= n 、A[m+1,n]三者中最大值子序列的問題,獲取三者種最大一個;
1 先來獲取A[i,...,j] 其中1 <= i <= m < j <= n中最大子序列(橫跨中點)
偽代碼如下:
序列
FIX-MAX-CROSSING-SUBARRAY(A , low , mid , high) {
// 先求A[low , mid]這端子序列最大值,因為要包括mid所以從mid開始
left-sum = -∞;
sum = 0;
max-left;
for (i = mid; i >= low; i++) {
sum = sum + A[i];
if(sum > letf-sum) {
left-sum = sum;
max-left = i;
}
}
// 再求A[mid+1, high]這端子序列最大值
right-sum = -∞;
sum = 0;
max-right;
for(i = mid+1; i <= high; i++) {
sum = sum + A[i];
if(sum > right-sum) {
right-sum = sum;
max-right = i;
}
}
return (max-left , max-right , left-sum+right-sum);
}
這樣就可以獲取A[i,...,j] 其中1 <= i <= m < j <= n中最大子序列(橫跨中點)
2 A[1,...,m](中點左側 包括中點) 和 A[i,...,j] 其中1 <= i <= m < j <= n (橫跨中點) ,倆個序列 像針對A序列一樣進行分解,
直到分解成序列中元素只有1位,並且每次分解都需要調用 FIX-MAX-CROSSING-SUBARRAY(A , low , mid , high) 獲取橫跨中點序列的最大值;
偽代碼如下 :
FIND-MAXIMUM-SUBARRAY(A , low , high) {
if (low == high) {
// 分解序列元素為1停止
return (low , high , A[low])
} else {
// 每次分解序列工作
mid = ↓[(low+high)/2];
// 分解中點左右倆端序列
(left-low , left-high , left-sum) = FIND-MAXIMUM-SUBARRAY(A , low , mid);
(right-low , right-high , right-sum) = FIND-MAXIMUM-SUBARRAY(A , mid+1 , high);
// 求出包含中點元素的序列的最大子序列
(cross-low , cross-high , cross-sum) = FIX-MAX-CROSSING-SUBARRAY(A , low , mid , high)
// 獲取三個子序列中最大值最大那個
if(left-sum >= right-sum and left-sum >= cross-sum) {
return (left-low , left-high , left-sum)
} else if(right-sum >= left-sum and right-sum >= cross-sum) {
return (right-low , right-high , right-sum)
} else {
return (cross-low , cross-high , cross-sum)
}
}
}
通過遞歸調用可以求出序列A子序列和最大值問題
時間復雜度影響因素 : 序列項數
時間復雜度 : Θ(nlgn)