最大連續和,對於分治法的初步理解

2021-09-22 02:01:16 字數 835 閱讀 3597

紫書中所講到的分治法第一次碰**是有些懵逼的,結合陳越姥姥對於演算法的引例的講解,算是大概明白了是怎麼回事。

我們知道乙個經典問題是求一段序列中的最大連續和。

有三種做法可以解決:

一是暴力三層巢狀迴圈直接求出所有的連續序列和,進行比較即可

二是求出所有字首和,之後後者減前者,算出每段的序列和比較。

前面兩者的時間複雜度方法一為o(n^3),方法二為o(n^2)

這並不符合我們通常對於複雜度的理想情況

因此引出分治法,分而治之,提高效率

首先此問題是求最大連續和,那麼我們可以假設在其中間劃分出一條界線,對兩邊分別求其最大連續子串行和(這裡向下遞迴)然後,求出分界線兩邊的最大連續和後,我們就此結束了嗎

我們這裡處理的只是分界線兩邊的連續序列,如果最大連續和是跨分界線的呢?

所以我們還要做乙個新連續和,該連續和由分界線向左右兩邊發出,依次求出由分界線向左和由分界線向右的連續和(必須包括分界線),然後兩邊連續和相加即可

下面貼**:

/* 第一步:先判斷得到左半邊的未跨中間線的最大子列和,然後得到右半邊的最大子列和,

之後從中間線往兩邊延伸得到由中間值而得到的最大子列和,三者進行比較,取最大值即可

第一步中可以得到左右兩邊未跨中間線的最大子列和,然後直接與跨邊界的最大子列和即可

*/#includeint a[10005];

int max(int a, int b)

int longsub(int a, int l, int r)

int main()

具體複雜度為o(nlogn)。具體分析在陳越姥姥的資料結構第一講中。

最大連續子串行和(分治法)

給n個數,要求n個數的最大連續子串行和。dp在o n 的時間內就能求出,很簡單。但這裡用分治的思想去做,複雜度是o nlogn 二分用了o logn 每次二分內的處理用了o n 將乙個序列對半切 mid 那麼這個最大連續子串行和要麼在 l,mid 要麼在 mid 1,r 要麼跨越兩邊。那麼就要求出 ...

求最大連續子串行和 分治法實現

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。tips 這裡的時間複雜度為o nlogn 本題的思路是二分查詢法中學到的分治法,明確一點,...

分治法解最大連續公共子串行

這篇文章是在自學演算法導論練習的 直接入正題 最大連續子串行 分治法 原理 一串陣列可以對半分,一串陣列的最大連續子串行可能是在左端,右端以及跨越中間 依次遞迴分解求得最小塊的最大值,再向上組合成整段最大連續子串行 include includeusing namespace std int max...