演算法分析之分治法學習總結(一)
一)解決問題的型別:當我們要解決乙個輸入規模(n)很大的問題時,直接處理往往比較困難或者根本無法
求解,我們希望把輸入規模縮小,即分成很多份,分別解決了,並且這些小問題容易合起來從而解決整個問
題。二)解題關鍵:
1)如何分:我們往往先把輸入分成兩個與原來相同的子問題,如果規模還太大,我們
對這些子問題再做上述處理,直到這些子問題容易解決為止.
2)合併子問題:往往分治法的難點在於分完之後怎麼合併.合併策略決定了演算法的優劣,合併問題根據具體問題而
定,沒有固定的方法
3)分治問題往往用到遞迴演算法.
三)幾種型別的分治問題:
1)把問題分成字問題後,如果某個子問題解決了則整個問題也就解決了,無須合併.
典型事例:二分檢索問題(前提是一組按照關鍵碼排好順序物件,不妨設按公升序排列)
二分檢索的解題思路是先看看中間那個數,如果這個數是要查詢的,那麼ok,問題解決,否則如果比key大,那麼
在前一半繼續上述過程,否則在後一半繼續上述過程,直到找到或者查詢失敗.
程式**:(設為int型數)
void binarysearch(int a,int low,int high,int key)
2)把問題分了之後,再經過合併最終解決問題.
典型事例:歸併排序問題:
這個問題就象我們在乙個很長的隊,現在要按大小個排好,我們把這個隊分成兩個(如果還是太長,可以再分,
先看分成兩個的問題,這樣容易看清合併過程),我們把這兩隊分別排好,然後合成一隊,合併的過程很簡單,就
是弄乙個新的隊,從那兩個個隊的排頭分別出列,比一下矮的站在第乙個位置,高的在一邊等著,等另乙個隊現
在的排頭出列,再比一下,矮的排在第二個位置,高的站在一邊,重複上述過程,直到有乙個隊變空,然後把另乙個
隊拉過來接在新隊的隊尾,這就排好了整個隊了.
歸併排序,就是把一組待排的關鍵值可比的東西,我們把他分成兩個小組,如果問題規模還不夠小,我們繼續
分,直到容易解決為止,然後把小的組排好續,然後合併成一組.
演算法過程:
void mergesort(int a,int low,int high)
void merge(int a,int low,int mid,int high)//合併過程
else
}if(i > mid)
for(int m=j;m<=high;m++)
b[k++] = a[m];
else
for(m=i;m=mid;m++)
b[k++] = a[m];
for(m=low,int n=0;m<=high;m++)
}
演算法分析之分治法學習總結(一)
演算法分析之分治法學習總結 一 一 解決問題的型別 當我們要解決乙個輸入規模 n 很大的問題時,直接處理往往比較困難或者根本無法 求解,我們希望把輸入規模縮小,即分成很多份,分別解決了,並且這些小問題容易合起來從而解決整個問 題。二 解題關鍵 1 如何分 我們往往先把輸入分成兩個與原來相同的子問題,...
演算法學習 點分治
演算法梗概 點分治,是一種針對可帶權樹上簡單路徑統計問題的演算法。本質上是一種帶優化的暴力,帶上一點容斥的感覺。注意對於樹上路徑,並不要求這棵樹有根,即我們只需要對無根樹進行統計。接下來請把無根樹這一關鍵點牢記於心。引入 話不多說,先看一題 給定一棵樹,樹上的邊有權值,給定乙個閾值 k 請統計這棵樹...
演算法學習 一 分治演算法
演算法學習 一 分治演算法 1.1 引言 當我們在處理一些問題時,由於這些問題要處理的資料很多,或者求解的過程很複雜,這時如果直接求解將會在時間上花費很長時間,或者根本沒辦法求出,對於這一類的問題,我們可以先把它分解為幾個子問題,找到並求出這些子問題的相應的解,然後再用適當的方法將他們組合成整個問題...