深搜与广搜
深度優(yōu)先搜索與廣度優(yōu)先搜索
深度優(yōu)先搜索的思想是盡可能深的搜索,算法藝術(shù)與信息學(xué)競賽一書中提到:隨機(jī)搜索就像是在慌亂之中找東西,因?yàn)槟悴⒉恢罇|西在哪,廣度優(yōu)先搜索則像是你的眼鏡掉在地上之
深度優(yōu)先搜索 (DFS)
深度優(yōu)先搜索屬于圖算法的一種,英文縮寫為DFS即Depth First Search.其過程簡要來說是對(duì)每一個(gè)可能的分支路徑深入到不能再深入為止,而且每個(gè)節(jié)點(diǎn)只能訪問一次;采用的搜索方法的特點(diǎn)是盡可能先對(duì)縱深方向進(jìn)行搜索。
基本思路編輯
深度優(yōu)先遍歷圖的方法是,從圖中某頂點(diǎn)v出發(fā):
(1)訪問頂點(diǎn)v;
(2)依次從v的未被訪問的鄰接點(diǎn)出發(fā),對(duì)圖進(jìn)行深度優(yōu)先遍歷;直至圖中和v有路徑相通的頂點(diǎn)都被訪問;
(3)若此時(shí)圖中尚有頂點(diǎn)未被訪問,則從一個(gè)未被訪問的頂點(diǎn)出發(fā),重新進(jìn)行深度優(yōu)先遍歷,直到圖中所有頂點(diǎn)均被訪問過為止。
? 例如對(duì)于以下一個(gè)樹:
????????? 1
??????? 2?? 3
????? 4?? 5?? 6
深度優(yōu)先的策略是1->2->4->退后一步->5->退后一步->退后一步->3->6->結(jié)束
而廣度優(yōu)先則是第一次:1->2->3第2次:4->5->6
從深度優(yōu)先的策略上看就知道深搜一般是用遞歸來實(shí)現(xiàn);深度優(yōu)先搜索的框架很簡單:
void DFS ( int n )
{
???? if ( 滿足結(jié)束條件,即搜索到終點(diǎn) )
???????? return ;
???? else
???????? DFS ( n + 1 );
}
深搜的框架是如此簡單,但是它可能有很多變種,一般用來搜索圖,那么傳的參數(shù)就不可能只有一個(gè)那么簡單;
廣度優(yōu)先搜索(BFS)
寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索)是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。Dijkstra單源最短路徑算法和Prim最小生成樹算法都采用了和寬度優(yōu)先搜索類似的思想。其別名又叫BFS,屬于一種盲目搜尋法,目的是系統(tǒng)地展開并檢查圖中的所有節(jié)點(diǎn),以找尋結(jié)果。換句話說,它并不考慮結(jié)果的可能位置,徹底地搜索整張圖,直到找到結(jié)果為止。
《算法導(dǎo)論》對(duì)兩種搜索都采用了很聰明的做法,用白色WHITE來標(biāo)志未發(fā)現(xiàn)的節(jié)點(diǎn),用灰色GRAY來標(biāo)志第一次被發(fā)現(xiàn)的節(jié)點(diǎn),用黑色BLACK來標(biāo)志第二次被發(fā)現(xiàn)的節(jié)點(diǎn)。
對(duì)比:
深度優(yōu)先搜索用棧(stack)來實(shí)現(xiàn),整個(gè)過程可以想象成一個(gè)倒立的樹形:
1、把根節(jié)點(diǎn)壓入棧中。
2、每次從棧中彈出一個(gè)元素,搜索所有在它下一級(jí)的元素,把這些元素壓入棧中。并把這個(gè)元素記為它下一級(jí)元素的前驅(qū)。
3、找到所要找的元素時(shí)結(jié)束程序。
4、如果遍歷整個(gè)樹還沒有找到,結(jié)束程序。
廣度優(yōu)先搜索使用隊(duì)列(queue)來實(shí)現(xiàn),整個(gè)過程也可以看做一個(gè)倒立的樹形:
1、把根節(jié)點(diǎn)放到隊(duì)列的末尾。
2、每次從隊(duì)列的頭部取出一個(gè)元素,查看這個(gè)元素所有的下一級(jí)元素,把它們放到隊(duì)列的末尾。并把這個(gè)元素記為它下一級(jí)元素的前驅(qū)。
3、找到所要找的元素時(shí)結(jié)束程序。
4、如果遍歷整個(gè)樹還沒有找到,結(jié)束程序。
總結(jié)
- 上一篇: nyoj 290
- 下一篇: hdu 1584蜘蛛牌(DFS)