【算法設計與分析】常用算法概述

一、【分治法】

分治法,字面上的解釋是分而治之,就是把一個複雜的問題分成多個的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。

任何一個可以用計算機求解的問題所需的計算時間都與其規模有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。

遞歸:直接或間接地調用自身的算法。(包括兩個部分:遞歸的出口和遞歸函數的表達式)。

分治是一種思想,遞歸是實現這種思想的一種手段。

 分治法所能解決的問題一般具有以下幾個特徵
  1) 該問題的規模縮小到一定的程度就可以容易地解決。
  2) 該問題可以分解爲若干個規模較小的相同問題,即該問題具有最優子結構性質。
  3) 利用該問題分解出的子問題的解可以合併爲該問題的解。
  4) 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。

分治法的基本步驟
     分治法在每一層遞歸上都有三個步驟:
  分解:將原問題分解爲若干個規模較小,相互獨立,與原問題形式相同的子問題;
  解決:若子問題規模較小而容易被解決則直接解,否則遞歸地解各個子問題;
  合併:將各個子問題的解合併爲原問題的解。
  它的一般的算法設計模式如下:

   Divide-and-Conquer(P)
  1. if |P|≤n0
  2. then return(ADHOC(P))
  3. 將P分解爲較小的子問題 P1 ,P2 ,...,Pk
  4. for i←1 to k
  5. do yi ← Divide-and-Conquer(Pi) △ 遞歸解決Pi
  6. T ← MERGE(y1,y2,...,yk) △ 合併子問題
  7. return(T) 

二、【動態規劃】

動態規劃與分治法類似,也是將原問題分解爲相對簡單的子問題,然後從這些子問題中得到原問題的解。

動態規劃常常適用於有重疊子問題最優子結構性質的問題。   

動態規劃與分治法區別:

動態規劃不是分治法,關鍵在於分解出來的各個子問題往往不是互相獨立的。分治法要求各個子問題是獨立的(即不包含公共的子問題),因此一旦遞歸地求出各個子問題的解後,便可自下而上地將子問題的解合併成原問題的解。如果各子問題是不獨立的,那麼分治法就要做許多不必要的工作,重複地解公共的子問題。

不同的是,分治法在子問題和子子問題等上被重複計算了很多次,而動態規劃則具有記憶性,通過填寫表把所有已經解決的子問題答案紀錄下來,在新問題裏需要用到的子問題可以直接提取,避免了重複計算,從而節約了時間,所以在問題滿足最優性原理之後,用動態規劃解決問題的核心就在於填表,表填寫完畢,最優解也就找到。

問題特徵:

      (1)最優子結構:當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。

      (2)重疊子問題:在用遞歸算法自頂向下解問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。動態規劃算法正是利用了這種子問題的重疊性質,對每一個子問題只解一次,而後將其解保存在一個表格中,在以後儘可能多地利用這些子問題的解。

算法步驟:

      (1)分析最優值的結構,刻畫其結構特徵;

      (2)遞歸地定義最優值;

      (3)以自底向上的方式計算最優值

      (4)根據最優值得到的信息構造最優解

三、【貪心算法】

貪心算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做的選擇只是在某種意義上的局部最優解。貪心算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解

貪心算法通常以自頂向下的方式進行,以迭代的方式作出相繼的貪心選擇,每作一次貪心選擇就將所求問題簡化爲規模更小的子問題。

貪心算法與動態規劃的區別:
共同點:兩者都具有最優子結構性質
不同點:
1)動態規劃算法中,每步所做的選擇往往依賴於相關子問題的解,因而只有在解出相關子問題時才能做出選擇。而貪心算法,僅在當前狀態下做出最好選擇,即局部最優選擇,然後再去解做出這個選擇後產生的相應的子問題。

2) 動態規劃算法通常以自底向上的方式解各子問題,而貪心算法則通常自頂向下的方式進行。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章