分治算法-01连续子序列的最大和问题
生活随笔
收集整理的這篇文章主要介紹了
分治算法-01连续子序列的最大和问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
連續(xù)子序列的最大和
- 前言
- 分治算法的核心思想是將一個(gè)規(guī)模很大的問(wèn)題化簡(jiǎn)為n個(gè)規(guī)模較小的問(wèn)題,這些子問(wèn)題雖然獨(dú)立而不同,但是問(wèn)題的本質(zhì)是一致的,從而達(dá)到分而治之的目的。
- 首先通過(guò)“分”將問(wèn)題分解為n個(gè)子問(wèn)題,再將子問(wèn)題一步步分解,知道達(dá)到最小的子問(wèn)題。這時(shí),“治”子問(wèn)題再利用子問(wèn)題的解推導(dǎo)總問(wèn)題的解。
- 子問(wèn)題應(yīng)與原問(wèn)題擁有同樣的結(jié)構(gòu),或者擁有同樣的形式。只有這樣,才能利用遞歸解決子問(wèn)題。
- 問(wèn)題描述
- 給定一個(gè)列表數(shù)據(jù),其中數(shù)據(jù)可正可負(fù),找出和最大的子列表的和,子列表不能為空。
- 問(wèn)題分析
- 這類題其實(shí)用DP也是一種解題思路,當(dāng)然也是分治的經(jīng)典問(wèn)題。
- 看一個(gè)例子,輸入列表如下。
- [-2, 1, -3, 4, -1, 2, 1, -5, 4]
- 按照分治的思路,最大子列表有可能在左子列表、右子列表或左子列表和右子列表之間。我們需要做的就是找到左子列表的最大子列表的和、右子列表的最大子列表的和、左子列表與右子列表之間的子列表的最大和,再進(jìn)行比較。
- 如何找到左子列表與右子列表的最大子列表的和呢?分治的想法是:讓左左子列表與右子列表的子列表回答這個(gè)問(wèn)題就好了,此時(shí)此刻不需要知道答案,只需要知道答案有三種可能。
- 現(xiàn)在需要做的是找到第三種可能,也就是左子列表與右子列表之間的子列表的最大和。設(shè)一個(gè)中點(diǎn),遍歷中點(diǎn)左邊的值,跟蹤記錄已經(jīng)遍歷過(guò)的值的總和,取這些總和的最大值;同樣的方法遍歷中點(diǎn)右邊的值。最后,左邊的最大值加上右邊的最大值加上中點(diǎn)值就是想要的值。
- 那么如何找第一種可能,也就是左子列表的最大和。其實(shí),對(duì)待左子列表的方式和對(duì)待列表一樣,還是有三個(gè)可能,第一個(gè)與第二個(gè)不關(guān)心,第三個(gè)按照上面的做法尋找。
- 如何找到第二種可能與上面一致。
- 按照這個(gè)一步步分解的思路,其實(shí),最后左右子列表都各有一個(gè)值,結(jié)果為三種可能最大的。最終,根據(jù)子問(wèn)題推到了大問(wèn)題的三種可能值,最終得到答案。
- 代碼
- # -*-coding:utf-8-*-def LSS(array):if array == []:returnif len(array) == 1:return array[0]cut = len(array) // 2 # 設(shè)置中點(diǎn)left_sum = LSS(array[: cut])right_sum = LSS(array[cut:])# 從中點(diǎn)開(kāi)始分別左右遍歷查值left_middle_sum = 0max_l = 0right_middle_sum = 0max_r = 0for i in range(cut-1, -1, -1):left_middle_sum += array[i]max_l = max(left_middle_sum, max_l)for j in range(cut+1, len(array), 1):right_middle_sum += array[j]max_r = max(right_middle_sum, max_r)return max(left_sum, right_sum, max_l+max_r+array[cut])if __name__ == '__main__':array = [-2, 1, -3, 4, -1, 2, 1, -5, 4]rst = LSS(array)print(rst)
- 運(yùn)行結(jié)果
- 補(bǔ)充說(shuō)明
- 具體代碼可以查看我的Github,歡迎Star或者Fork
- 參考書(shū)《你也能看得懂的Python算法書(shū)
總結(jié)
以上是生活随笔為你收集整理的分治算法-01连续子序列的最大和问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 贪心算法-03哈夫曼编码问题
- 下一篇: 分治算法-02凸包问题