深度優先搜尋(縮寫dfs)有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。
廣度優先搜尋(bfs)是按照乙個樹的層次來完成搜尋的。
缺點:當樹的層次較深&&子節點過多的時候,消耗記憶體極其嚴重
解釋如下:
假設乙個節點衍生出來的相鄰節點平均的個數是n個,那麼當起點開始搜尋的時候,佇列有乙個節點,當起點拿出來後,把它相鄰的節點放進去,那麼佇列就有n個節點,當下一層的搜尋中再加入元素到佇列的時候,節點數達到了n^2,你可以想想,一旦n是乙個比較大的數&&這個樹的層次又比較深,那這個佇列就得需要很大的記憶體空間了。
優點:可以尋找無權圖的最短路~
深度優先搜尋(dfs)在每次搜尋的過程中每層僅僅只需要維護乙個節點,記憶體消耗小。但是,剛剛也提到了深度優先搜尋是沿著一條路找到黑的,需要找到所有的路徑才可以確定最短路徑。
缺點:難以尋找最優解
優點:記憶體消耗小
/**
*dfs偽**(遞迴實現)
*@param n 當前開始搜尋的節點
*@param step 當前到達的深度,即任務完成量的一種度量
*/void
dfs(node n,
int step)
for(node nextnode in n)
}}
洛谷-八皇后遞迴問題
#includeusing namespace std;
bool ldiagonal[400];//左對角線
bool rdiagonal[200];//右對角線
bool cow[200];//列
int cash[15];//快取
int n;//棋盤大小
int ans;
/* *@param step 當前到達的深度,即任務完成量的一種度量
*由於問題的特殊性,當前訪問節點可以用step代替
*/void solve(int step){
if(step >= n){//任務是否完成的度量
ans++;
if(ans <= 3){
for(int i = 0;i < n;i++){
cout<>n;
solve(0);
cout《最後,總結一下
深度優先搜尋的演算法需要你對遞迴有一定的認識,其中最重要的思想就是:抽象!
可以從dfs函式裡邊看到,dfs裡邊永遠只處理當前狀態節點n,而不去關注它的下乙個狀態。
它通過把dfs方法抽象加上使用遞迴,使整個邏輯就變得十分的清晰。
演算法學習 4 1 深度優先搜尋
深度優先搜尋演算法的基本模型如下 void dfs int step 返回 深度優先搜尋的關鍵在於解決 當下該如何做 下一步如何做可以遞迴呼叫當下該如何做。例如 有n張牌,輸出牌的可能排列的順序 include int a 10 book 10 n void dfs int step step表示現...
演算法學習 看看深度優先搜尋演算法
先看一題 給定整數a1,a2,a3 an,判斷是否可以從中選出若干數,使他們的和恰好為k。那麼,現在分析一下問題的需求。只需從a1開始按順序決定每個數加或者不加,在管不n個數都決定後在判斷他們的和是否為k即可。換乙個方式想,從某個狀態開始不斷的轉移狀態直到無法轉移,然後然後回退到前一步的狀態,繼續轉...
深度優先演算法學習 案例
挑戰程式設計競賽第二版 巫澤俊 1.部分和問題 給定整數a1 a2 an,判斷是否可以從中選出若干數,使他們的和恰好為k。限制條件 1 n 20 10 8 ai 108 108 k 108 題解 利用深度優先演算法,分情況計算下去,遞迴。樣例 輸入 n 4 a k 15 輸出 no include ...