编程五大常用算法
1、遞歸與分治
遞歸算法:直接或者間接不斷反復(fù)調(diào)用自身來達(dá)到解決問題的方法。這就要求原始問題可以分解成相同問題的子問題。
示例:階乘、斐波納契數(shù)列、漢諾塔問題
簡(jiǎn)單遞歸
public static void main(String[] args) {System.out.println(recursion(100));}private static int recursion(int i) {System.out.println(i);if (i == 0) return -1;return recursion(i / 3);}?
?
3、將各個(gè)子問題的解合并得到原問題的解
示例:棋盤覆蓋、找出偽幣、求最值
棋盤覆蓋:在一個(gè)(2k)*(2k)個(gè)方格組成的棋盤上,有一個(gè)特殊方格與其他方格不同,稱為特殊方格,稱這樣的棋盤為一個(gè)特殊棋盤。要求對(duì)棋盤的其余部分用L型方塊填滿
?
?
2、動(dòng)態(tài)規(guī)劃
動(dòng)態(tài)規(guī)劃與分治法相似,都是組合子問題的解來解決原問題的解,與分治法的不同在于:分治法的子問題是相互獨(dú)立存在的,而動(dòng)態(tài)規(guī)劃應(yīng)用于子問題重疊的情況。
動(dòng)態(tài)規(guī)劃方法通常用來求解最優(yōu)化問題,這類問題可以有很多可行解,每個(gè)解都有一個(gè)值,找到具有最優(yōu)值的解稱為問題的一個(gè)最優(yōu)解,而不是最優(yōu)解,可能有多個(gè)解都達(dá)到最優(yōu)值。
設(shè)計(jì)動(dòng)態(tài)規(guī)劃算法的步驟:
1、刻畫一個(gè)最優(yōu)解的結(jié)構(gòu)特征
2、遞歸地定義最優(yōu)解的值
3、計(jì)算最優(yōu)解的值,通常采用自底向上的方法
4、利用算出的信息構(gòu)造一個(gè)最優(yōu)解
示例:0-1背包問題,鋼條切割問題等。
3、貪心算法
貪心算法是就問題而言,選擇當(dāng)下最好的選擇,而不從整體最優(yōu)考慮,通過局部最優(yōu)希望導(dǎo)致全局最優(yōu)。
貪心算法的要素
1)貪心選擇性質(zhì):可以通過局部最優(yōu)選擇來構(gòu)造全局最優(yōu)解。換言之,直接做出在當(dāng)前問題中看來最優(yōu)的選擇,而不必考慮子問題的解。
2)最優(yōu)子結(jié)構(gòu):一個(gè)問題的最優(yōu)解包含其子問題的最優(yōu)解。
貪心算法的設(shè)計(jì)步驟:
1)將最優(yōu)化問題轉(zhuǎn)換為這樣的形式:對(duì)其做出一次選擇后,只剩下一個(gè)子問題需要求解
2)證明做出貪心選擇后,原問題總是存在最優(yōu)解,即貪心選擇總是安全的
3)證明做出貪心選擇后,剩余的子問題滿足性質(zhì):其最優(yōu)解與貪心選擇組合即可得到原問題的最優(yōu)解,這樣就得到了最優(yōu)子結(jié)構(gòu)。
示例:背包問題,均分紙牌,最大整數(shù)
4、回溯法
回溯法是一種搜索算法,從根節(jié)點(diǎn)出發(fā),按照深度優(yōu)先搜索的策略進(jìn)行搜索,到達(dá)某一節(jié)點(diǎn)后 ,探索該節(jié)點(diǎn)是否包含該問題的解,如果包含則進(jìn)入下一個(gè)節(jié)點(diǎn)進(jìn)行搜索,若是不包含則回溯到父節(jié)點(diǎn)選擇其他支路進(jìn)行搜索。
回溯法的設(shè)計(jì)步驟:
1)針對(duì)所給的原問題,定義問題的解空間
2)確定易于搜索的解空間結(jié)構(gòu)
3)以深度優(yōu)先方式搜索解空間,并在搜索過程中用剪枝函數(shù)除去無效搜索。
示例:0-背包問題、旅行商問題、八皇后問題
5、 分支限界法
和回溯法相似,也是一種搜索算法,但回溯法是找出問題的許多解,而分支限界法是找出原問題的一個(gè)解。或是在滿足約束條件的解中找出使某一目標(biāo)函數(shù)值達(dá)到極大或極小的解,即在某種意義下的最優(yōu)解
在當(dāng)前節(jié)點(diǎn)(擴(kuò)展節(jié)點(diǎn))處,先生成其所有的兒子節(jié)點(diǎn)(分支),然后再?gòu)漠?dāng)前的活節(jié)點(diǎn)(當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn))表中選擇下一個(gè)擴(kuò)展節(jié)點(diǎn)。為了有效地選擇下一個(gè)擴(kuò)展節(jié)點(diǎn),加速搜索的進(jìn)程,在每一個(gè)活節(jié)點(diǎn)處,計(jì)算一個(gè)函數(shù)值(限界),并根據(jù)函數(shù)值,從當(dāng)前活節(jié)點(diǎn)表中選擇一個(gè)最有利的節(jié)點(diǎn)作為擴(kuò)展節(jié)點(diǎn),使搜索朝著解空間上有最優(yōu)解的分支推進(jìn),以便盡快地找出一個(gè)最優(yōu)解。
分支限界法:
1)FIFO分支限界法
3)優(yōu)先隊(duì)列分支限界法:按照優(yōu)先隊(duì)列中規(guī)定的優(yōu)先級(jí)選取優(yōu)先級(jí)最高的節(jié)點(diǎn)成為當(dāng)前擴(kuò)展節(jié)點(diǎn)。
示例:裝載問題,旅行售貨員問題
總結(jié)
- 上一篇: [Bugku][Web][CTF] 16
- 下一篇: Unity3D的断点调试功能