1. 程式人生 > 其它 >[資料結構]最大子序列和問題

[資料結構]最大子序列和問題

最大子序列和問題

最大子序列和是指,給定一組序列,如 [1,-3,2,4,5],求子序列之和的最大值,對於該序列來說,最大子序列之和為 2 + 4 + 5 = 11。

這裡的子序列要求是連續的,因此也可以稱其為連續子陣列最大和。

有幾種不同的方法求解最大子序列和問題,但它們的複雜度相差甚遠,尤其在面對大量資料的時候。實際上,效率最高的演算法非常簡短,只需要幾行程式碼,最主要的是理解它的思想。


基本演算法(暴力):

int MaxSubseqSum1(int A[])
{
    int ThisSum, MaxSum = 0;
    int i, j;
    for (i = 0;i < N;i++)
    {
        ThisSum 
= 0; for (j = 0;j < N;j++) { ThisSum += A[j]; if (ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; }

分治法:

易知,最大連續子序列和要麼出現在陣列左半部分,要麼出現在陣列右半部分,要麼橫跨左右兩半部分。因此分別求出這三種情況下的最大值然後進行比較就可以得到最大連續子序列和。

這種方法的時間複雜度為 O(nlgn),在此不詳細介紹。

線上處理:

int MaxSubseqSum1(int A[], int N)
{
    int ThisSum, MaxSum = 0;
    int i;
    ThisSum = MaxSum=0;
    for (i = 0;i < N;i++)
    {
        ThisSum += A[i];
        if (ThisSum > MaxSum)
            MaxSum = ThisSum;
        else if (ThisSum < 0)
            ThisSum = 0;
    }
    return
MaxSum; }

這種方法的時間複雜度為 O(n),可以說是最佳解法了。

因為是突然打算做的,所以沒弄註釋,各位自行理解一下程式碼吧


製作:BDT20040