持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
算法基础——搜索技术
搜索是基本的编程技术,在算法学习中是基础的基础。搜索使用的算法是BFS和DFS,BFS用队列、DFS用递归来具体实现。
搜索技术是“暴力法”算法思想的具体实现。暴力法(Brute force,又译为蛮力法):把所有可能的情况都罗列出来,然后逐一检查,从中找到答案。这种方法简单、直接,不玩花样,利用了计算机强大的计算能力。
虽然暴力法常常是低效的代名词,但是它仍然很有用,原因如下:
(1)很多问题只能用暴力法解决,例如猜密码。
(2)对于小规模的问题,暴力法完全够用,而且避免了高级算法需要的复杂编码。
(3)把暴力法当作参照( benchmark)。既然暴力法是“最差”的,那么可以把它当成一个比较来衡量另外的算法有多“好”。
不过,在具体编程时常常需要对暴力法进行优化,以减少搜索空间,提高效率。例如利用剪枝技术跳过不符合要求的情况,从而减少复杂度。
虽然暴力搜索的思路很简单,但是操作起来并不容易。一般有以下操作:
(1)找到所有可能的数据,并且用数据结构表示和存储。
(2)剪枝。尽量多地排除不符合条件的数据﹐以减少搜索的空间。
(3)用某个算法快速检索这些数据。
BFS
定义:
广度优先算法(Breadth-First-Search),简称BFS,是一种图形搜索演算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点,如果发现目标,则演算终止。
算法分析:
BFS是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
常见应用:
(1)迷宫问题 (2)八数码问题 (3)最短路径等
DFS
深度优先搜索是用来遍历或搜索树和图数据结构的算法,它是可以从任意跟节点开始,选择一条路径走到底,并通过回溯来访问所有节点的算法。简单来说就是通过选择一条道路走到无路可走的时候回退到上一个岔路口,并标记这条路已走过,选择另外一条道路继续走,直到走遍每一条路。
深度优先搜索的步骤分为 1.递归下去 2.回溯上来。顾名思义,深度优先,则是以深度为准则,先一条路走到底,直到达到目标。这里称之为递归下去。
否则既没有达到目标又无路可走了,那么则退回到上一步的状态,走其他路。这便是回溯上来。
void dfs(){//参数用来表示状态
if(到达终点状态){
...//根据题意来添加
return;
}
if(越界或者是不符合法状态)//剪枝
return;
for(扩展方式){
if(扩展方式所达到状态合法){
....//根据题意来添加
标记;
dfs();
修改(剪枝);
(还原标记);
//是否还原标记根据题意
//如果加上(还原标记)就是 回溯法
}
}
}
常见应用:
(1)求无向图的连通分量 (2)拓扑排序 (3)二分图判断等