深搜和廣搜的原理及優缺點


原文來源:https://blog.csdn.net/dark_cy/article/details/88926435

深搜原理
深搜,顧名思義,是深入其中、直取結果的一種搜索方法。
  如果深搜是一個人,那么他的性格一定倔得像頭牛!他從一點出發去旅游,只朝着一個方向走,除非路斷了,他絕不改變方向!除非四個方向全都不通或遇到終點,他絕不后退一步!因此,他的姐姐廣搜總是嘲笑他,說他是個一根筋、不撞南牆不回頭的家伙。
  深搜很討厭他姐姐的嘲笑,但又不想跟自己的親姐姐鬧矛盾,於是他決定給姐姐講述自己旅途中的經歷,來改善姐姐對他的看法。他成功了,而且只講了一次。從那以后他姐姐不僅再沒有嘲笑過他,而且連看他的眼神都充滿了贊賞。他以為是自己路上的各種英勇征服了姐姐,但他不知道,其實另有原因……
  深搜是這樣跟姐姐講的:關於旅行呢,我並不把目的地的風光放在第一位,而是更注重於沿路的風景,所以我不會去追求最短路,而是把所有能通向終點的路都走一遍。可是我並不知道往哪走能到達目的地,於是我只能每到一個地方,就向當地的人請教各個方向的道路情況。為了避免重復向別人問同一個方向,我就給自己規定1 :先問北,如果有路,那就往北走,到達下一個地方的時候就在執行此規定,如果往北不通,我就再問西,其次是南、東,要是這四個方向都不通或者抵達了終點,那我回到上一個地方,繼續探索其他沒去過的方向。我還要求自己要記住2 那些幫過他的人,但是那些給我幫倒忙的、讓我白費力氣的人,要忘記3他們。有了這些規定之后,我就可以大膽的往前走了,既不用擔心到不了不目的地,也不用擔心重復走以前的路。哈哈哈……

深搜優缺點

    • 優點
      1、能找出所有解決方案
      2、優先搜索一棵子樹,然后是另一棵,所以和廣搜對比,有着內存需要相對較少的優點
    • 缺點
      1、要多次遍歷,搜索所有可能路徑,標識做了之后還要取消。
      2、在深度很大的情況下效率不高

 深搜模板

void DFS() //N代表目前DFS的深度
{
    if(找到解) //進行相應的操作
    {
        …
        return;
    }
    for(inti=0;i<4;i++) //枚舉四個方向
    {
        DFS(N+1); //進入下層遞歸
    }
}

廣搜原理
廣搜,顧名思義,是多管齊下、廣撒網的一種搜索方法
  如果廣搜是一個人,那么她一定很貪心,而且喜新厭舊!她從一點出發去旅游,先把與起點相鄰的地方全部游覽一遍,然后再把與她剛游覽過的景點相鄰的景點全都游覽一遍……一直這樣,直至所有的景點都游覽一遍
  廣搜屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。類似樹的按層遍歷,其過程為:首先訪問初始點Vi,並將其標記為已訪問過,接着訪問Vi的所有未被訪問過可到達的鄰接點Vi1、Vi2…Vit,並均標記為已訪問過,然后再按照Vi1、Vi2…Vit 的次序,訪問每一個頂點的所有未被訪問過的鄰接點,並均標記為已訪問過,依此類推,直到圖中所有和初始點Vi有路徑相通的頂點都被訪問過為止。

廣搜優缺點

    • 優點
      1、對於解決最短或最少問題特別有效,而且尋找深度小
      2、每個結點只訪問一遍,結點總是以最短路徑被訪問,所以第二次路徑確定不會比第一次短
    • 缺點
      1、內存耗費量大(需要開大量的數組單元用來存儲狀態)

廣搜模板

void BFS() 
{     … …//初始化起點入隊 
    while(!q.empty()) //判斷隊是否為空
    {    … …//獲取隊首元素
        if(... …){… …}//判斷是否是終點
        for(int i=0;i<4;i++)//四個方向
        { 
            k.x=p.x+dir[i][0];
            k.y=p.y+dir[i][1];
            //向各個方向走一步
             if(judge())//判斷能不能走
            {
                … …//各種處理 
                vis[k.x][k.y]=1; //標記     
                q.push(k); //入隊
            }
        }
    }
}

廣搜打印路徑:雖然它有多個后繼結點,但前驅節點只有一個。所以可以逆向打印路徑,即從終點出發找通向起點的路徑。

 

 


 

  1. 遍歷四個方向

  2. 標記,標識已經走過的結點

  3. 取消標記

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM