DFS和BFS
2016-07-27 16:13
169 查看
介绍:
DFS:使用栈保存未被检测的结点,结点按照深度优先的次序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测。
类似于树的先根遍历
深搜例子:走迷宫,你没有办法用分身术来站在每个走过的位置。不撞南山不回头。
BFS:使用队列保存未被检测的结点。结点按照宽度优先的次序被访问和进、出队列。
类似于树的按层次遍历的过程
广搜例子:你的眼镜掉在地上以后,你趴在地板上找。你总是先摸最接近你的地方,如果没有,再摸远一点的地方……
使用范围:
DFS用来搜索是否能够到达目的地
BFS用来搜索最短路径或最小次数(因为BFS求得的结果就是最短或最小的)
DFS模板:
BFS模板:
剪枝心得:
1,当限制条件为不大于k次时,要注意当等于k次时是否继续下去。例:连连看
DFS:使用栈保存未被检测的结点,结点按照深度优先的次序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测。
类似于树的先根遍历
深搜例子:走迷宫,你没有办法用分身术来站在每个走过的位置。不撞南山不回头。
BFS:使用队列保存未被检测的结点。结点按照宽度优先的次序被访问和进、出队列。
类似于树的按层次遍历的过程
广搜例子:你的眼镜掉在地上以后,你趴在地板上找。你总是先摸最接近你的地方,如果没有,再摸远一点的地方……
使用范围:
DFS用来搜索是否能够到达目的地
BFS用来搜索最短路径或最小次数(因为BFS求得的结果就是最短或最小的)
DFS模板:
DFS(dep,…) //dep代表目前DFS的深度 { if (找到解||走不下去了) { … return; } 枚举下一种情况,DFS(dep+1,…) }
BFS模板:
初始化队列Q. Q={起点s}; 标记s为己访问; while (Q非空) { 取Q队首元素u; u出队; if (u == 目标状态) {…} 所有与u相邻且未被访问的点进入队列; 标记u为已访问; }
剪枝心得:
1,当限制条件为不大于k次时,要注意当等于k次时是否继续下去。例:连连看
相关文章推荐
- 银行家算法实现——找出所有安全序列
- 栈的效率为什么比堆高?
- Leetcode 34. Search for a Range (Medium) (cpp)
- java静态和动态代理原理
- Xcode7.2.1制作framework库
- 随笔_1
- CentOS6下安装docker
- 【HDU 1208】Pascal's Travels(动态规划DP)
- JD-GUI在Ubuntu 14.04 64位系统依赖包失败的问题
- hdu 3440 House Man (有向图的建立)(★)
- 数字证书
- 本地线程ThreadLocal
- 深入Java核心 Java内存分配原理精讲
- redhat压缩,解压,打包
- python对模块中类的方法的计时
- web前端面试题
- 用Android Studio打Jar包
- html5中的canvas线性渐变
- ConcurrentHashMap实现原理总结--下
- SqlServer 自动备份、自动删除7天前备份