紫書中所講到的分治法第一次碰**是有些懵逼的,結合陳越姥姥對於演算法的引例的講解,算是大概明白了是怎麼回事。
我們知道乙個經典問題是求一段序列中的最大連續和。
有三種做法可以解決:
一是暴力三層巢狀迴圈直接求出所有的連續序列和,進行比較即可
二是求出所有字首和,之後後者減前者,算出每段的序列和比較。
前面兩者的時間複雜度方法一為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...