分治算法總結(jié)

分治法學(xué)習(xí)總結(jié)

分治法是我們經(jīng)常用到的算法紊撕,合理利用分治算法可以使我們更好的解決問題。我們在使用二分查找赡突、歸并排序的時(shí)候都要用到分治算法对扶。下面我將從三個(gè)方面介紹分治算法区赵,方便我們更好的了解和學(xué)習(xí)分治算法。
1.分治算法介紹
2.分治算法應(yīng)用分析
3.分治算法例題分析

1.分治算法介紹

1.基本概念

分治算法的基本思想是將一個(gè)規(guī)模為N的問題分解為K個(gè)規(guī)模較小的子問題浪南,這些子問題相互獨(dú)立且與原問題性質(zhì)相同笼才。求出子問題的解,就可得到原問題的解络凿。即一種分目標(biāo)完成程序算法骡送,簡單問題可用二分法完成。

2.解題思路

1喷众、原問題可以分解為多個(gè)子問題
這些子問題與原問題相比各谚,只是問題的規(guī)模有所降低,其結(jié)構(gòu)和求解方法與原問題相同或相似到千。
2昌渤、原問題在分解過程中,遞歸地求解子問題
由于遞歸都必須有一個(gè)終止條件憔四,因此膀息,當(dāng)分解后的子問題規(guī)模足夠小時(shí),應(yīng)能夠直接求解了赵。
3潜支、在求解并得到各個(gè)子問題的解后
應(yīng)能夠采用某種方式、方法合并或構(gòu)造出原問題的解柿汛。
不難發(fā)現(xiàn)冗酿,在分治策略中,由于子問題與原問題在結(jié)構(gòu)和解法上的相似性络断,用分治方法解決的問題裁替,大都采用了遞歸的形式。在各種排序方法中貌笨,如歸并排序弱判、堆排序、快速排序等锥惋,都存在有分治的思想 昌腰。

2.分治算法應(yīng)用分析

先讓我們通過一個(gè)簡單的二分查找來理解分治算法的基本思路。

public static int commonBinarySearch(int[] arr,int key){
        int low = 0;
        int high = arr.length - 1;
        int middle = 0;         //定義middle
        
        if(key < arr[low] || key > arr[high] || low > high){
            return -1;              
        }
        
        while(low <= high){
            middle = (low + high) / 2;
            if(arr[middle] > key){
                //比關(guān)鍵字大則關(guān)鍵字在左區(qū)域
                high = middle - 1;
            }else if(arr[middle] < key){
                //比關(guān)鍵字小則關(guān)鍵字在右區(qū)域
                low = middle + 1;
            }else{
                return middle;
            }
        }
        
        return -1;      //最后仍然沒有找到膀跌,則返回-1
    }

首先先在排序的數(shù)組找到中間值遭商,定義我們的中間值,找到就返回捅伤,找不到就在符合條件的子問題繼續(xù)二分株婴,直到滿足邊界條件退出循環(huán)。

1.歸并排序

歸并排序(MERGE-SORT)是利用歸并的思想實(shí)現(xiàn)的排序方法,該算法采用經(jīng)典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然后遞歸求解困介,而治(conquer)的階段則將分的階段得到的各答案"修補(bǔ)"在一起,即分而治之)蘸际。
第一, 分解: 把待排序的 n 個(gè)元素的序列分解成兩個(gè)子序列, 每個(gè)子序列包括 n/2 個(gè)元素.
第二, 治理: 對每個(gè)子序列分別調(diào)用歸并排序MergeSort, 進(jìn)行遞歸操作
第三, 合并: 合并兩個(gè)排好序的子序列,生成排序結(jié)果.


分治圖解.jpg
分治圖解.jpg
public static int[] sort(int[] a,int low,int high){
        int mid = (low+high)/2;
        if(low<high){
            sort(a,low,mid);
            sort(a,mid+1,high);
            //左右歸并
            merge(a,low,mid,high);
        }
        return a;
    }
     
    public static void merge(int[] a, int low, int mid, int high) {
        int[] temp = new int[high-low+1];
        int i= low;
        int j = mid+1;
        int k=0;
        // 把較小的數(shù)先移到新數(shù)組中
        while(i<=mid && j<=high){
            if(a[i]<a[j]){
                temp[k++] = a[i++];
            }else{
                temp[k++] = a[j++];
            }
        }
        // 把左邊剩余的數(shù)移入數(shù)組 
        while(i<=mid){
            temp[k++] = a[i++];
        }
        // 把右邊邊剩余的數(shù)移入數(shù)組
        while(j<=high){
            temp[k++] = a[j++];
        }
        // 把新數(shù)組中的數(shù)覆蓋nums數(shù)組
        for(int x=0;x<temp.length;x++){
            a[x+low] = temp[x];
        }
    }
2.快速排序

給定數(shù)組int[]a={7,5,3,2,9,10,8,4,6,1};
第1步:找基準(zhǔn)值
所謂的基準(zhǔn)值座哩,顧名思義就是以它為基準(zhǔn)進(jìn)行比大小。通常來說粮彤,我們選取數(shù)組的第一個(gè)數(shù)為基準(zhǔn)值根穷。在數(shù)組a里基準(zhǔn)值就是7.
第2步:比大小
先從數(shù)組的最右邊開始往左邊找比基準(zhǔn)值小的第一個(gè)數(shù),然后從數(shù)組的最左邊開始往右找比基準(zhǔn)值大的第一個(gè)數(shù)导坟。那么為什么要這么找呢屿良?因?yàn)楝F(xiàn)在我們要把數(shù)組從小到大排序,所以要找出比基準(zhǔn)值小的數(shù)放到基準(zhǔn)值的左邊惫周,找出比基準(zhǔn)值的數(shù)放在基準(zhǔn)值的右邊尘惧。
那么在數(shù)組a里,從左往右找递递,第一個(gè)比7大的數(shù)就是9喷橙,我們把它的坐標(biāo)記為i;從右往左找登舞,第一個(gè)比7小的數(shù)就是1贰逾,我們把它的坐標(biāo)記為j。
第3步:交換
找到之后菠秒,如果這個(gè)時(shí)候i<j疙剑,那么就交換這兩個(gè)數(shù),因?yàn)閕=4,j=9践叠,符合條件言缤,將9和1進(jìn)行交換。現(xiàn)在數(shù)組變成了int[]a={7,5,3,2,1,10,8,4,6,9};
如果j>=i酵熙,那么不做處理
為什么還要判斷i和j的大小呢轧简?就像第二步說的,我們要找出比基準(zhǔn)值小的數(shù)放到基準(zhǔn)值的左邊匾二,找出比基準(zhǔn)值的數(shù)放在基準(zhǔn)值的右邊哮独。所以如果i<j的話,交換就達(dá)到目的了察藐,如果i>=j皮璧,比基準(zhǔn)值小的數(shù)就在基準(zhǔn)值的左邊,比基準(zhǔn)值大的數(shù)已經(jīng)在基準(zhǔn)值的右邊了分飞,這時(shí)候就沒必要交換了悴务。
第4步:繼續(xù)查找
在i<j的前提下,繼續(xù)向右查找比基準(zhǔn)值大的數(shù),往左找比基準(zhǔn)值小的數(shù)讯檐,然后交換羡疗。
在我們的例子中,10和6别洪、8和4都符合交換的條件叨恨,所以數(shù)組就變成了
int[]a={7,5,3,2,1,6,4,8,10,9};這時(shí)候i=6,j=7
第5步:交換基準(zhǔn)值到合適的位置
當(dāng)查找繼續(xù)進(jìn)行,這時(shí)候i=j=6挖垛,已經(jīng)不滿足繼續(xù)查找和交換的條件了痒钝,那么我們應(yīng)該怎么辦呢?答案就是把a(bǔ)[6]和基準(zhǔn)值交換痢毒,因?yàn)閕=j的時(shí)候說明已經(jīng)到了一個(gè)分界線的位置送矩,分界線左邊的數(shù)比基準(zhǔn)值小,分界線右邊的數(shù)比基準(zhǔn)值大哪替,而這個(gè)分界線就是我們的基準(zhǔn)值栋荸,所以把它和a[i]交換,這時(shí)候數(shù)組就變成:
int[]a={4,5,3,2,1,6,7,8,10,9};
第6步:重復(fù)
對基準(zhǔn)值左右兩邊的兩個(gè)子數(shù)組重復(fù)前面五個(gè)步驟直至排序完成夷家。

分治算法例題分析

最大子序和

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒸其,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子库快,更是在濱河造成了極大的恐慌摸袁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件义屏,死亡現(xiàn)場離奇詭異靠汁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闽铐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蝶怔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兄墅,你說我怎么就攤上這事踢星。” “怎么了隙咸?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵沐悦,是天一觀的道長。 經(jīng)常有香客問我五督,道長藏否,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任充包,我火速辦了婚禮副签,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己淆储,他們只是感情好冠场,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遏考,像睡著了一般慈鸠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灌具,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天譬巫,我揣著相機(jī)與錄音咖楣,去河邊找鬼。 笑死芦昔,一個(gè)胖子當(dāng)著我的面吹牛诱贿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咕缎,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼珠十,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凭豪?” 一聲冷哼從身側(cè)響起焙蹭,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫂伞,沒想到半個(gè)月后孔厉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帖努,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年撰豺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拼余。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡污桦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匙监,到底是詐尸還是另有隱情凡橱,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布舅柜,位于F島的核電站梭纹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏致份。R本人自食惡果不足惜变抽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绍载,春花似錦诡宗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阳谍,卻和暖如春蛀柴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矫夯。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工鸽疾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人训貌。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓制肮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親递沪。 傳聞我的和親對象是個(gè)殘疾皇子豺鼻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序款慨,而外部排序是因排序的數(shù)據(jù)很大儒飒,一次不能容納全部...
    蟻前閱讀 5,183評論 0 52
  • 排序算法說明 (1)排序的定義:對一序列對象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序; 輸入:n個(gè)數(shù):a1,a2,a3,…,an 輸...
    code武閱讀 658評論 0 0
  • 參考:十大經(jīng)典排序算法 0樱调、排序算法說明 0.1排序的定義 對一序列對象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序约素。 0.2 術(shù)語說明...
    誰在烽煙彼岸閱讀 1,012評論 0 12
  • 寫給徐不二的情書(1) 親愛的徐不二: 很高興認(rèn)識你,謝謝你出現(xiàn)在我的生命里笆凌。 你來了圣猎,我就不允許你再離開了,你可...
    穆念青閱讀 878評論 6 3
  • 課堂教學(xué)中實(shí)現(xiàn)“變教為學(xué)”乞而,主要取決于三個(gè)方面的重要因素送悔,一是教師研讀教材水平的提高,二是教師“讓學(xué)生在大量的實(shí)踐...
    一身書生氣閱讀 1,509評論 0 0