最大子串行和問題的求解

2021-08-11 11:27:41 字數 1606 閱讀 4066

問題描述:給定(可能存在負值)整數a1,a

2.....a

n,求最大子串行和。如果所有的整數均為負數,則最大子串行和為0.

列如:對於輸入-2,11,-4,13,-5,-2,該輸入的最大子串行和為20(11-4+13).

現在我們將敘述四個演算法來求解最大子串行和問題。

1. 該演算法是使用窮舉法來嘗試所有的可能 演算法如下

public static int maxsubsum1(int  a)

} }return maxsum;

}

該演算法的時間複雜度為o(n3)

第乙個演算法的第三個for迴圈中有大量不必要的重複計算,如:計算i到j的和,然而i到j-1的和在前一次的迴圈中已經計算過,無需重複計算,故該for迴圈可以去掉

演算法2 

public static int maxsubsum2(int  a)

} }return maxsum;

}

該演算法的複雜度為o(n2).

對於這個問題有乙個遞迴解法,該方法採用一種分治的策略。其想法是把問題分為兩個大致相等的子問題。然後遞迴地對他們求解,在使用分治的時候,最大子串行可能出現在三個不同的部位,可能出現在左半部分,可能出現在右半部分,也可能出現在出現在左右交界處,前兩種情況可以遞迴求解,第三種情況的最大和可以通過求出前半部分的最大和以及後半部分的最大和,然後將兩個結果進行相加,考慮下列輸入:

其中前半部分的最大和為6(從元素a1到a3)而後半部分的最大子串行和為8(從元素a6到a7)

前半部分包含其最後乙個元素的最大和為4,而後半部分包含其第乙個元素的最大和為7,因此跨越這兩個部分且通過中間的最大和為11.

private static int maxsumrec(int  a int left,int right)

else

}int center=(left+right)/2;

int maxleftsum=maxsumrec(a,left,center);

int maxrightsum=maxsumrec(a,center+1;right);

int maxleftbordersum=0;leftbordersum=0;

for(int i=center;i>=left;i--)

int maxrightbordersum=0;rightbordersum=0;

for(int i=center+1;i<=right;i++)

return max(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);

}private static int max(int left,int right,int middle)

演算法四

private static int maxsubsum4(int  a)

return maxsum;

}

演算法四的時間複雜度為o(n)

最大子串行和問題求解

基本思想 窮舉式的嘗試所有可能,通過三層迴圈計算所有子串行的和。演算法步驟 1.第一層迴圈從0到n 1,確定子串行的開始位置 2.第二層迴圈從第一層迴圈變數開始到n 1,確定子串行的結束位置 3.第三層迴圈從第一層迴圈變數開始到第二層迴圈變數結束,計算這個子串行的和,並與最大子串行和比較,如果大於最...

求解最大子串行和問題

原題 給定乙個陣列,其中元素有正,也有負,找出其中乙個連續子串行,使和最大 不想說明什麼,我們資料結構老師第一節課就給我們講這個,以前給實現過乙個暴力演算法版的演算法複雜度 o n2 現在實現乙個動態規劃版的 求解最大子串行和問題o n 演算法 param array public static v...

最大子串行和問題的求解

怎麼求出乙個陣列最大的連續累加之和呢?方法有很多,我們目前只講乙個比較不錯的方法,該方法使用了分治遞迴的思想。我們假設下面是我們需要計算的陣列,其中a是游標,我可以知道游標將陣列分成了兩段,最大值有可能出現在前半段也有可能出現在後半段,還有一種情況是跨越a 中間 相加的一段。1,3,5,7 a,9,...