1. 程式人生 > >分治法,動態規劃法,貪心法,回溯法,分支限界法的區別和聯絡以及適用情況

分治法,動態規劃法,貪心法,回溯法,分支限界法的區別和聯絡以及適用情況

    筆者這學期的《演算法設計與分析》課程已經進入尾聲,在這裡對學過的演算法進行總結歸納。筆者先對各個演算法的思想進行簡單的陳述,然後再進行對比。

一、演算法思想

    (一)分治法(divide and conquer method)

    是將待求解的原問題劃分成k個較小規模的子問題,對這k個子問題分別求解。如果子問題的規模仍然不夠小,則再將每個子問題劃分為k個規模更小的子問題,如此分解下去,直到問題規模足夠小,很容易求出其解為止(子問題求解思路一致),再將子問題的解合併為一個更大規模的問題的解,自底向上逐步求出原問題的解。

    (二)動態規劃法(dynamic programing method)

    是將待求解問題分解成若干個相互重疊的子問題,每個子問題對應決策過程的一個階段,一般來說,子問題的重疊關係表現在對給定問題求解的遞推關係(也就是動態規劃函式)中,將子問題的解求解一次並填入表中,當需要再次求解此子問題時,可以通過查表獲得該子問題的解而不用再次求解,從而避免了大量重複計算。

    (三)貪心法(greedy method)

    貪心法在解決問題的策略上目光短淺,只根據當前已有的資訊就做出選擇,而且一旦做出了選擇,不管將來有什麼結果,這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域性最優。這種區域性最優選擇並不總能獲得整體最優解(Optimal Solution),但通常能獲得近似最優解(Near-Optimal Solution)。

    (四)回溯法(back track method)

    回溯法就是一種有組織的系統化搜尋技術,可以看作是蠻力法窮舉搜尋的改進。回溯法每次只構建可能解的一部分,然後評估這個部分解,如果這個部分有可能導致一個完全解,對其進一步搜尋,否則,就不必繼續構造這部分的解了,回溯法常常可以避免搜尋所有可能的解,所以,它往往比滿立法效率更高,適用於求解組合陣列較大的問題。

    (五)分支限界法(branch and bound method)

分支限界法按廣度優先策略遍歷問題的解空間,在遍歷過程種,對已經處理的每一個結點根據限界函式估算目標函式的可能值,從中選取使目標函式取得極值(極大或極小)的結點優先進行廣度優先搜尋,從而不斷調整搜尋方向,儘快找到問題的解。因為界限函式常常是基於問題的目標函式而確定的,所以,分支限界法適用於求解最優化問題。

二、演算法差異

    (一)分治法和動態規劃法的區別

共同點:二者都要求原問題具有最優子結構性質,都將原問題分成若干個子問題,然後將子問題的解合併,形成原問題的解。

    不同點:動態規劃法是將待求解問題分解成若干個相互重疊的子問題,而分治法是分解成若干個互不相交的子問題。利用分治法求解,這些子問題的重疊部分被重複計算多次。而動態規劃法將每個子問題只求解一次並講其儲存在一個表格中,當需要再次求解此子問題時,只是簡單地通過查表獲得該子問題的解,從而避免了大量的重複計算。

    (二)動態規劃法和貪心法的區別

共同點:貪心演算法和動態規劃演算法都要求問題具有最優子結構性質。

    不同點:動態規劃法用到之前的最優解,貪心則不是,貪心無法解決動態規劃的問題,但是動態規劃能解決貪心的問題。雖然能夠應用貪心演算法一定能夠應用動態規劃法,但是一般來說,貪心演算法的效率高於動態規劃法,因而還是應用貪心演算法。動態規劃演算法通常以自底向上的方式解各子問題,而貪心演算法則通常以自頂向下的方式進行,以迭代的方式作出相繼的貪心選擇,每做一次貪心選擇就將所求問題簡化為規模更小的子問題。

    (三)回溯法和分支限界法的區別

    共同點:一種在問題的解空間樹上搜索問題解的演算法。

    不同點:求解目標不同,回溯法的目標是找出解空間樹滿足約束條件的所有解,而分支限界法的求解目標是儘快地找出滿足約束條件的一個解;搜尋方法不同,回溯法採用深度優先方法搜尋解空間,而分支限界法一般採用廣度優先或以最小消耗優先的方式搜尋解空間樹;對擴充套件結點的擴充套件方式不同,回溯法中,如果當前的擴充套件結點不能夠再向縱深方向移動,則當前擴充套件結點就成為死結點,此時應回溯到最近一個活結點處,並使此活結點成為擴充套件結點。分支限界法中,每一次活結點只有一次機會成為擴充套件結點。活結點一旦成為擴充套件結點,就一次性產生其所有兒子結點;儲存空間的要求不同,分支限界法的儲存空間比回溯法大得多,當記憶體容量有限時,回溯法成功的可能性更大。

三、適用情況

    (一)分治法

    適用特徵:該問題的規模縮小到一定的程度就可以容易地解決;可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質;利用該問題分解出的子問題的解可以合併為該問題的解;所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。

    典型代表:二分搜尋、棋盤覆蓋、合併排序、最接近點對問題、迴圈賽日程表、漢諾塔......

    (二)動態規劃法

    適用特徵:該問題問題的最優解所包含的子問題的解也是最優的,即滿足最優化原理;某狀態以後的過程不會影響以前的狀態,只與當前狀態有關;子問題之間是不獨立的,一個子問題在下一階段決策中可能被多次使用到。

    典型代表:最長公共子序列、最優二叉查詢樹、近似串匹配問題......

    (三)貪心法

    適用特徵:該問題區域性最優策略能導致產生全域性最優解(貪心演算法適用的情況很少)。

    典型代表:TSP問題(最近鄰點)、TSP問題(最短連結)、圖著色、揹包問題、多極度排程問題......

    (四)回溯法

    適用特徵:該問題是求解組合數量較大;需要找出該問題的解集(全部解)或者要求回答什麼解是滿足某些約束條件的最優解。

    典型代表:哈密頓迴路問題、八皇后問題、批處理作業排程......

    (五)分支限界法

    適用特徵:求解最優化問題。

    典型代表:任務分配問題、多段圖的最短路徑問題、批處理作業排程問題、電路佈線問題......

    以上便是讀者對五大演算法的歸納總結,歡迎讀者留言討論指出不足。另外,筆者主頁有一些具體演算法的討論,感興趣的讀者可以看看。