前言
搜索算法有许多种,但用的最多的还是深搜和宽搜,不管是值找最短路径,还是找最优解,都能看到这两个的身影。下面就来详细看看这两个的不同于适用情况。
深搜
深搜,看名字就知道到是优先往深处找,不撞南墙终不悔。深搜,像是一个人走迷宫,遇见岔路不知道怎么走,就瞎选一个(程序中一搬从头遍历),走到底,不对,回到岔路口,选另一条路,接着走。
深搜的实现一般用栈或递归,不断深入。
深搜一般是为了找多个解,或者找解存不存在。但当数据量很大时,深搜效率不高,一般要结合其他优化算法。
伪代码:
dfs(要搜的点){
将该点标记为已搜过
if(终止条件){
如果找存在路径,就退出
如果找最短路径,就比较这个与最小值,回去接着找
}
else{
case1{
目标值变化
dfs(case1);
目标值恢复到原来
}
case2 ...
case3 ...
}
}
深搜典型题:回溯法(八皇后问题)
需要设置一个数组判断该点有无被访问过
宽搜
宽搜全名宽度搜索,就是放宽了搜,就像是雷达那样,中间一个点不断放出电磁波,一圈一圈往外扩散,很容易就能发现目标,而且发现了必然就是最近的(最优解)。
宽搜的实现一般使用队列,不断扩散。
宽搜在寻找最短路径上效率很高,但相对占用的内存较大。
伪代码:
bfs(){
初始点入列
while(终止条件不满足 或 队列不为空){
队列头出列
从出列元素开始扩散,满足的就入列
找个数组记下来目标值
}
找目标值
}
宽搜典型题:迷宫找最短路径,细菌的扩散
总结
深搜和宽搜都是搜索的主要方法,但由于两种算法都有其局限性,当数据量较大时,一般都不用这两种算法。
本文转载链接:https://blog.csdn.net/qq_39747794/article/details/84478771
1150

被折叠的 条评论
为什么被折叠?



