深搜和廣搜的差別

前言

搜索算法有許多種,但用的最多的還是深搜和寬搜,不管是值找最短路徑,還是找最優解,都能看到這兩個的身影。下面就來詳細看看這兩個的不同於適用情況。

深搜

深搜,看名字就知道到是優先往深處找,不撞南牆終不悔。深搜,像是一個人走迷宮,遇見岔路不知道怎麼走,就瞎選一個(程序中一搬從頭遍歷),走到底,不對,回到岔路口,選另一條路,接着走。

深搜的實現一般用棧或遞歸,不斷深入。

深搜一般是爲了找多個解,或者找解存不存在。但當數據量很大時,深搜效率不高,一般要結合其他優化算法。

僞代碼:

dfs(要搜的點){
    將該點標記爲已搜過
    if(終止條件){
        如果找存在路徑,就退出
        如果找最短路徑,就比較這個與最小值,回去接着找
    }
    else{
        case1{
            目標值變化
            dfs(case1);
            目標值恢復到原來  
        }
        case2 ...
        case3 ...
    }
}

深搜典型題:回溯法(八皇后問題)
需要設置一個數組判斷該點有無被訪問過

寬搜

寬搜全名寬度搜索,就是放寬了搜,就像是雷達那樣,中間一個點不斷放出電磁波,一圈一圈往外擴散,很容易就能發現目標,而且發現了必然就是最近的(最優解)。

寬搜的實現一般使用隊列,不斷擴散。

寬搜在尋找最短路徑上效率很高,但相對佔用的內存較大。

僞代碼:

bfs(){
    初始點入列
    while(終止條件不滿足 或 隊列不爲空){
        隊列頭出列
        從出列元素開始擴散,滿足的就入列
        找個數組記下來目標值
    }
    找目標值
}

寬搜典型題:迷宮找最短路徑,細菌的擴散

總結

深搜和寬搜都是搜索的主要方法,但由於兩種算法都有其侷限性,當數據量較大時,一般都不用這兩種算法。

本文轉載鏈接:https://blog.csdn.net/qq_39747794/article/details/84478771

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章