前言
搜索算法有許多種,但用的最多的還是深搜和寬搜,不管是值找最短路徑,還是找最優解,都能看到這兩個的身影。下面就來詳細看看這兩個的不同於適用情況。
深搜
深搜,看名字就知道到是優先往深處找,不撞南牆終不悔。深搜,像是一個人走迷宮,遇見岔路不知道怎麼走,就瞎選一個(程序中一搬從頭遍歷),走到底,不對,回到岔路口,選另一條路,接着走。
深搜的實現一般用棧或遞歸,不斷深入。
深搜一般是爲了找多個解,或者找解存不存在。但當數據量很大時,深搜效率不高,一般要結合其他優化算法。
僞代碼:
dfs(要搜的點){
將該點標記爲已搜過
if(終止條件){
如果找存在路徑,就退出
如果找最短路徑,就比較這個與最小值,回去接着找
}
else{
case1{
目標值變化
dfs(case1);
目標值恢復到原來
}
case2 ...
case3 ...
}
}
深搜典型題:回溯法(八皇后問題)
需要設置一個數組判斷該點有無被訪問過
寬搜
寬搜全名寬度搜索,就是放寬了搜,就像是雷達那樣,中間一個點不斷放出電磁波,一圈一圈往外擴散,很容易就能發現目標,而且發現了必然就是最近的(最優解)。
寬搜的實現一般使用隊列,不斷擴散。
寬搜在尋找最短路徑上效率很高,但相對佔用的內存較大。
僞代碼:
bfs(){
初始點入列
while(終止條件不滿足 或 隊列不爲空){
隊列頭出列
從出列元素開始擴散,滿足的就入列
找個數組記下來目標值
}
找目標值
}
寬搜典型題:迷宮找最短路徑,細菌的擴散
總結
深搜和寬搜都是搜索的主要方法,但由於兩種算法都有其侷限性,當數據量較大時,一般都不用這兩種算法。
本文轉載鏈接:https://blog.csdn.net/qq_39747794/article/details/84478771