深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次;
採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。
基本思路:
深度優先遍歷圖的方法是,從圖中某頂點v出發:
(1)訪問頂點v;
(2)依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;
(3)若此時圖中尚有頂點未被訪問,則從乙個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。
例如對於以下乙個樹:
12 3
4 5 6
深度優先的策略是1->2->4->退後一步->5->退後一步->退後一步->3->6->結束
而廣度優先則是第一次:1->2->3第2次:4->5->6
從深度優先的策略上看就知道深搜一般是用遞迴來實現;深度優先搜尋的框架很簡單:
void dfs ( int n )
特點:多變。
廣度優先搜尋演算法(又稱廣度優先搜尋)是最簡便的圖的搜尋演算法之一,這一演算法也是很多重要的圖的演算法的原型。最短路和最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其別名又叫bfs,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。
深度優先搜尋用棧(stack)來實現,整個過程可以想象成乙個倒立的樹形:
1、把根節點壓入棧中。
2、每次從棧中彈出乙個元素,搜尋所有在它下一級的元素,把這些元素壓入棧中。並把這個元素記為它下一級元素的前驅。
3、找到所要找的元素時結束程式。
4、如果遍歷整個樹還沒有找到,結束程式。
廣度優先搜尋使用佇列(queue)來實現,整個過程也可以看做乙個倒立的樹形:
1、把根節點放到佇列的末尾。
2、每次從佇列的頭部取出乙個元素,檢視這個元素所有的下一級元素,把它們放到佇列的末尾。並把這個元素記為它下一級元素的前驅。
3、找到所要找的元素時結束程式。
4、如果遍歷整個樹還沒有找到,結束程式。
廣搜和深搜
一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數 已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...
深搜和廣搜
qq 親密度用的是帶權圖中,每條邊都有乙個 weight 我們可以通過這個權重來表示 qq 好友間的親密度。鄰接矩陣儲存方法 對於無向圖來說,如果頂點 i 與頂點 j 之間有邊,我們就將 a i j 和 a j i 標記為 1 對於有向圖來說,如果頂點 i 到頂點 j 之間,有一條箭頭從頂點 i 指...
廣搜和深搜
深度優先搜尋 dfs,運用遞迴函式,通過棧的結構進行搜尋。模板 dfs 狀態 if 狀態 是 目標狀態then dosomething else for 每個新狀態 if 新狀態合法 dfs 新狀態 主程式 dfs 初始狀態 廣度優先搜尋 bfs,運用遞迴函式,通過佇列的方式搜尋。dfs就是對於某乙...