搜索与数据结构
来源:互联网 发布:慈世平生涯数据 编辑:程序博客网 时间:2024/04/29 22:36
通常都说能用深搜不用广搜,其实在一定条件下确实有道理。在很多情况下,深度优先搜索通常比广度优先搜索写起来简单、方便。同时,采用简单的递归方法来描述深度优先搜索,可以避开对数据结构的操作。同时,深度优先搜索不需要一个巨大的队列来记录,因此可以节约内存。但使用深度优先搜索需要合理并且足量的剪枝才能完成。
本文对这些内容分别进行讨论和整理。因水平较低,有不尽之处欢迎各位批评指正。
深度优先搜索
深度优先搜索遵循深度优先,遇阻回溯的原则,可以构造出如下的伪代码。
void dfs(int depth)
{
if(出现问题) return;
if(到达终点) ……
if(满足剪枝条件) ……
else 处理数据;dfs(depth+1);
return;
}
典型样例:N皇后问题
这是一个很典型的深度优先搜索问题。套用上面的规程,(出现问题)就是验证是否有两个皇后互相可以干扰,(到达终点)就开始输出,此题无需进一步剪枝,处理数据就是对皇后摆放位置的循环。
广度优先搜索
广度优先搜索遵循层层遍历,存取队列的原则,可以构造出如下的伪代码
void bfs()
{
for(循环条件)
{
数据处理;
if(重复)continue;
if(满足终点条件)……;
else queue.push(……);
}
return;
}
典型样例:马的遍历问题
这是一个很典型的广度优先搜索的问题。套用伪代码,我们通过一个for循环来从当前坐标向着8个可到达的点扩展。如果扩展后遍历成功,就输出;未成功就判断是否重复,不重复就压入队列。一次for结束后从队列中pop一个坐标出来,然后继续。
需要注意的是,本题有几个可以优化的地方(下面的参考代码中可能未给出)
1.储存坐标的时候,很多认为需要使用结构体储存,这样固然是一种方法,但是写起来麻烦,有时浪费内存。一种偷懒的方法,就是利用坐标<10000的原理,将x*10000+y这样一个整数来表示坐标。其实就是运用了二维图像映射到一维内存的原理。
2.去重的时候常用bool数组。其实如果需要的话使用bit压缩在很大程度上能降低check()的时间复杂度,而且节约内存。
- 搜索与数据结构
- 算法与数据结构 - 搜索算法
- 数据结构与算法问题 二叉搜索树
- 数据结构与算法 (二叉搜索树)
- 【数据结构与算法】十二 字符串搜索
- 数据结构与算法之四 搜索算法
- 面试复习-------算法与数据结构------二分搜索
- 数据结构与算法8:图的深度优先搜索
- 数据结构与算法9: 图的广度优先搜索
- 数据结构基础 之 二叉搜索树的思想与实现
- 《数据结构与算法分析》搜索二叉树详解
- 数据结构6——图 广度与深度优先搜索
- 《数据结构与算法》学习笔记28 图搜索
- 【数据结构】二叉搜索树的递归与非递归实现
- 数据结构与算法(C语言版)__图的搜索
- 【数据结构与算法】二叉搜索树 及 常用操作
- 数据结构与基本算法的学习笔记-顺序搜索-2
- 数据结构与算法____树, 二叉树, 二叉搜索树
- Java中创建对象的5种方式
- Subsets II
- hive相关操作语句
- 特征工程(sklearn)
- 多线程
- 搜索与数据结构
- php 统计网站流量
- JavaScript DOM事件(笔记)
- 深入分析Java ClassLoader原理
- 自定义ViewGroup打造微信朋友圈之九宫图效果
- PS常见问题03——如何绘制水平、竖直及45°直线
- listview进行item多选、全选、反选操作。
- li:hover与a:hover的区别
- 我的见解之hibernate(八)