資料結構 最大子串行和

2021-08-17 04:03:01 字數 1297 閱讀 7982

最近我打算重溫一遍資料結構,於是又遇到了求最大子串行和這一基本問題。記得之前我就沒有明白透徹,這次便記錄下來。

求最大子串行和,即求乙個序列中,和值最大的連續子串行。首先採用暴力解法,即求出所有的子串行和,得到最大和,這個演算法的時間複雜度是o(n^2)。

int maxsubsum(int k, int a)	//k是序列個數,用陣列a儲存

} return maxsubsum;

}

若是得到了

時間複雜度o(n^2)的演算法,我們得嘗試優化到o(n*logn)。於是可以採用分治法,遞迴地解決這個問題——即把序列一分為二,分別遞迴求得左半邊和右半邊子串行最大和,再求出跨分界線子串行最大和,三者中的最大值即為所求,如下圖所示:

為什麼這個演算法的時間複雜度是o(n*logn)呢?因為長度n的子串行需花費時間是

t(n) = 2 * t(n/2) + cn        其中t(1) = o(1)

由此可推出,  t(n) = 2 * ( 2 * t(n/4) + c*n/2 ) + cn

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

....

t(n) = 2^n * o(1) + k*cn    其中 n / 2^k = 1    

即    t(n) = 2 ^n * o(1) + n*logn

因此,分治法的時間複雜度是o(n*logn)。

函式實現如下:

int max3(int x, int y, int z)	//求三者中最大值

int divideandconquer(int a, int left, int right)

else

for (int i = centre + 1; i <= right; i++) //往右依次掃瞄

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

}}

最後,採用即時處理的演算法,可以使時間複雜度降至o(n)。它的實現是:從輸入的第乙個數起,就進行累和,更新出現的最大和,若當前累和是負數,則棄之,從下乙個數起重新累和。**如下:

int maxsubsum(int k)

return maxsum;

}

至此,關於這道題的三種不同演算法都介紹完了。通過此題,有助於我理解並分析時間複雜度,比較不同演算法間的優劣。

資料結構 最大子串行號

01 複雜度1 最大子列和問題 20分 給定k 個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入第1行給出正整數k 100 000 第2行給出 ...

資料結構與演算法分析 最大子串行和問題

最大連續子數列和一道很經典的演算法問題,給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列 不允許空序列 使它們的和盡可能大。我們一起用多種方式,逐步優化解決這個問題。例 輸入時,答案為 20 從a2到 a4 演算法1 include n是陣列長度,a是待計算的陣列,放在...

資料結構與演算法 最大子串行和的實現

個人部落格 學習筆記 cs notes 最大子串行和 題目 給定 可能有負數 整數a 1 a 2 a n 求 a 1 a 2 a j 的最大值。為方便起見,若所有的整數為負數,則最大子串行和為0.也就是 在一系列整數中,找出連續的若干個整數,這若干個整數之和 最大。實現 c 語言版 函式原型為 in...