搜索总结

 **

基础算法之搜索

**

一 、深度优先搜索

1.基本概念

搜索是计算机程序设计中一种最基本、最常用的算法。搜索算法是直接基于计算机高速运的
特点而使用的计算机求解方法。
它是从问题的初始状态出发,根据其中的约束条件,按照一定的策略,有序推进,不断深入,
对于达到的所有目标状态,一一验证,找到符合条件的解(可行解),或者找出所有可行解中的最优解。
谈一下我的理解,其实dfs就像走迷宫一样,当我们走到某个分岔口,由于不知道到底哪个是出口,所以我们只能随便选择一条路(编程时一般是按顺序从第一个开始遍历),当我们又碰到一个分岔口时,我们需要再进行选择,如果碰到死胡同,这时就需要我们原路返回到上一个分岔口,然后选择另一条路,如此往复,直到走出迷宫。
2.深搜优缺点
优点:
(1)能找出所有解决方案;

(2)优先搜索一条路径,然后是另一条,所以和广搜对比,有着内存需要相对较少的优点。

缺点 :
(1)要多次遍历,搜索所有可能路径,打了标记之后需要取消;

(2)在深度很大的情况下效率不高(容易爆——时间超限);

(3)且从输出结果可看出,深度优先搜索找到的第一个解并不一定是最优解(如果需要最优解,再来比较,太浪费时间)。

总的来说深搜就是用时间换空间
3.算法框架及常见模型
深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式 比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当搜索深度较大时,当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。
因为深搜“退回一步”的顺序符合“后进先出”的特点,所以我们通常采用递归的方式实现。
递归基本框架:
void dfs(int k, )
{
if( 满足要求 ){
输出解或者作计数 ;
}else
for(i = 1; i <= 算符种数 ; i++)
if( 第 i 种状态符合要求 ){
保存自定义变量;
dfs(k+1 );
}
}
深搜基本模型:
void dfs(k) // k代表目前dfs的深度

{

if(找到解)

{

… // 进行相应的操作

return;

}

for(int i=0;i<4;i++) // 枚举四个方向

{

dfs(k+1); // 进入下层递归

}

}

4.经典例题

(1)八皇后问题:在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上。问共有多少种不同的方法,并且按字典序从小到大指出各种不同的放法。

解题思想

用深搜模拟当前棋盘上皇后的位置,判断当前位置可不可以放下皇后若可以,储存下皇后的纵坐标,当8个皇后放完之后开始下一轮模拟,直到找到最后一种解。

(2)自然数的拆分:任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
解题思想

在dfs函数中传入当前递归层数,记录当前分解的值并搜索下一层。

二、回溯

1.基本概念

回溯法是搜索算法中的一种控制策略。它是从问题的某一状态出发,不断“试探”着往前走一步,当一条路走到“尽头”,不能再前进(拓展出新状态)的时候,再倒回一步或者若干步,从另一种可能的状态出发,继续搜索,直到所有的“路径(状态)”都一一试探过。这种不断前进、不断回溯,寻找解的方法,称为“回溯法”。
深度优先搜索求解的时候,当找到目标结点之后,还要回头寻找初始结点到目标结点的解路径。而回溯法则不同,找到目标结点之后,搜索路径就是一条从初始结点到目标结点的解路径。回溯法实际上是状态空间搜索中,深度优先搜索的一种改进,是更实用的一种搜索求解方法。
2.基本框架
[一]
int dfs(int k, )
{
if( 满足要求 ){
输出解或者作计数 ;
}else
for(i = 1; i <= 算符种数 ; i++)
if( 第 i 种状态符合要求 ){
保存自定义变量;
dfs(k+1 );
恢复:保存结果之前的状态{回溯一步}
}
}
[二]
int dfs(int k)
{
for(int i=1;i<=算符种数;i++)
{
if(满足条件)
{
保存结果
if(到目的地) 输出解;
else dfs(k+1);
恢复:保存结果之前的状态{回溯一步}



3.深度优先搜索与回溯法的关系
1.深度优先搜索包含回溯,或者说回溯法是深度优先搜索的一种。
2.深度优先搜索需要控制如何实现状态之间的转移(拓展),回溯法就是深度优先搜索的一种控制策略。
3.回溯的过程中,其最大优点是占用空间少。
4.深度优先搜索可以采用递归和非递归两种方法实现。递归搜索是系统栈实现一部分的回溯,而非递归是自己用手工栈模拟回溯的过程,所以实现起来略为复杂一点。

三、广度优先搜索

1.定义
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化).
像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的操作,像什么起码状态转换也是可以操作的。
经典例题
Dfs:1.八皇后问题https://www.luogu.com.cn/problem/P1219

Bfs:1.细胞问题https://www.luogu.com.cn/problem/P1451
Bfs:2.奇怪的电梯https://www.luogu.com.cn/problem/P1135

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值