1. 程式人生 > >五大常用演算法的簡單介紹

五大常用演算法的簡單介紹

1、遞迴與分治

遞迴演算法:直接或者間接不斷反覆呼叫自身來達到解決問題的方法。這就要求原始問題可以分解成相同問題的子問題。

示例:階乘、斐波納契數列、漢諾塔問題

斐波納契數列:又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞迴的方法定義:F1=1,F2=1,Fn=F(n-1)+F(n-2)(n>2,n∈N*))。

分治演算法:待解決複雜的問題能夠簡化為幾個若干個小規模相同的問題,然後逐步劃分,達到易於解決的程度。

1、將原問題分解為n個規模較小的子問題,各子問題間獨立存在,並且與原問題形式相同

2、遞迴的解決各個子問題

3、將各個子問題的解合併得到原問題的解

示例:棋盤覆蓋、找出偽幣、求最值

棋盤覆蓋:在一個(2^k)*(2^k)個方格組成的棋盤上,有一個特殊方格與其他方格不同,稱為特殊方格,稱這樣的棋盤為一個特殊棋盤。要求對棋盤的其餘部分用L型方塊填滿

2、動態規劃

動態規劃與分治法相似,都是組合子問題的解來解決原問題的解,與分治法的不同在於:分治法的子問題是相互獨立存在的,而動態規劃應用於子問題重疊的情況。

動態規劃方法通常用來求解最優化問題,這類問題可以有很多可行解,每個解都有一個值,找到具有最優值的解稱為問題的一個最優解,而不是最優解,可能有多個解都達到最優值。

設計動態規劃演算法的步驟:

1、刻畫一個最優解的結構特徵

2、遞迴地定義最優解的值

3、計算最優解的值,通常採用自底向上的方法

4、利用算出的資訊構造一個最優解

示例:0-1揹包問題,鋼條切割問題等。

3、貪心演算法

貪心演算法是就問題而言,選擇當下最好的選擇,而不從整體最優考慮,通過區域性最優希望導致全域性最優。

貪心演算法的要素

1)貪心選擇性質:可以通過區域性最優選擇來構造全域性最優解。換言之,直接做出在當前問題中看來最優的選擇,而不必考慮子問題的解。

2)最優子結構:一個問題的最優解包含其子問題的最優解。

貪心演算法的設計步驟:

1)將最優化問題轉換為這樣的形式:對其做出一次選擇後,只剩下一個子問題需要求解

2)證明做出貪心選擇後,原問題總是存在最優解,即貪心選擇總是安全的

3)證明做出貪心選擇後,剩餘的子問題滿足性質:其最優解與貪心選擇組合即可得到原問題的最優解,這樣就得到了最優子結構。

示例:揹包問題,均分紙牌,最大整數

4、回溯法

回溯法是一種搜尋演算法,從根節點出發,按照深度優先搜尋的策略進行搜尋,到達某一節點後 ,探索該節點是否包含該問題的解,如果包含則進入下一個節點進行搜尋,若是不包含則回溯到父節點選擇其他支路進行搜尋。

回溯法的設計步驟:

1)針對所給的原問題,定義問題的解空間

2)確定易於搜尋的解空間結構

3)以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式除去無效搜尋。

示例:0-揹包問題、旅行商問題、八皇后問題

5、 分支限界法

和回溯法相似,也是一種搜尋演算法,但回溯法是找出問題的許多解,而分支限界法是找出原問題的一個解。或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意義下的最優解

在當前節點(擴充套件節點)處,先生成其所有的兒子節點(分支),然後再從當前的活節點(當前節點的子節點)表中選擇下一個擴充套件節點。為了有效地選擇下一個擴充套件節點,加速搜尋的程序,在每一個活節點處,計算一個函式值(限界),並根據函式值,從當前活節點表中選擇一個最有利的節點作為擴充套件節點,使搜尋朝著解空間上有最優解的分支推進,以便儘快地找出一個最優解。

分支限界法:

1)FIFO分支限界法

3)優先佇列分支限界法:按照優先佇列中規定的優先順序選取優先順序最高的節點成為當前擴充套件節點。

示例:裝載問題,旅行售貨員問題