LeetCode刷题之BFS和DFS
广度优先搜索(BFS)
主要用于树的层序遍历或图的最短路径寻找,主要使用队列queue来完成。
①树的层序遍历:使用队列保存未被检测的结点,结点按照宽度优先的次序被访问和进出队。
②有向无环图的最短路径查找:由于有向无环图的某个节点的next节点可能会与另一个节点的next节点重复,所以我们需要记录已访问过的节点
//根节点与目标节点之间的最短路径长度
int BFS(Node root, Node target) {
Queue<Node> queue; // 用来存放节点的队列
Set<Node> used; // 用来存放已经使用过的节点
int step = 0; // 步长
//1:初始化
add root to queue;
add root to used;
//2:开始进行BFS
while (queue is not empty) {
step = step + 1;
//队列中已经存放的节点个数
int size = queue.size();
for (int i = 0; i < size; ++i) {
Node cur = the first node in queue;
return step if cur is target;
for (Node next : the neighbors of cur) {
if (next is not in used) {
add next to queue;
add next to used;
}
}
remove the first node from queue;
}
}
return -1; // there is no path from root to target
}
深度优先搜索(DFS)
一直往深处走,直到找到解或者走不下去为止,主要用于树的遍历(前序遍历,中序遍历,后序遍历)或者图的搜索问题或者回溯算法问题。
①树的遍历:一直向叶子节点遍历,直至遇到叶子节点表示此根节点到这个叶子节点的路径已经访问完,需要访问根节点到下一个叶子节点的路径。(当然遍历顺序主要取决于遍历的方式,比如前序遍历(根左右)、后序遍历(左根右)、后序遍历(左右根))
②图的搜索问题:上面我们使用了BFS来解决图的最短路径问题,同时我们也可以使用DFS来实现图的最短路径寻找。在这里我们分别提供递归版模板和用stack的迭代版模板:
递归:
boolean DFS(Node cur, Node target, Set<Node> visited) {
return true if cur is target;
for (next : each neighbor of cur) {
if (next is not in visited) {
add next to visted;
return true if DFS(next, target, visited) == true;
}
}
return false;
}
非递归:
boolean DFS(int root, int target) {
Set<Node> visited;
Stack<Node> s;
add root to s;
while (s is not empty) {
Node cur = the top element in s;
return true if cur is target;
for (Node next : the neighbors of cur) {
if (next is not in visited) {
add next to s;
add next to visited;
}
}
remove cur from s;
}
return false;
}
回溯法:回溯法使用DFS的策略来寻找所有可行解或者最优解,也就是回溯法的所有解可以构成一个解空间树或者解空间图,所以对于这个解空间树或图,我们就使用DFS策略了
//choicelist:表示可以进行选择的列表,相当于树中可选用左节点还是右结点
//track:表示为决策路径,相当于在树中为根节点到某个叶子节点的路径
//result:表示存放根节点到所有叶子节点的所有路径
backtrack(choicelist,track,result)
{
if(track is ok)result.push(track);
else{
for choice in choicelist:
//choose过程:选择一个choice加入track,相当于在树中选择一个节点加入路径
backtrack(choices,track,result);//进入下一步决策
//unchoose过程:从track中撤销上面的选择,相当于在树中移除上一次选择的节点
}
}
应用与风险:
1)DFS多用于连通性问题因为其运行思想与人脑的思维很相似,故解决连通性问题更自然。
2)BFS多用于解决最短路问题,其运行过程中需要储存每一层的信息,所以其运行时需要储存的信息量较大,如果人脑也可储存大量信息的话,理论上人脑也可运行BFS。
3)多数情况运行BFS所需的内存会大于DFS需要的内存(DFS一次访问一条路,BFS一次访问多条路)
4)风险:DFS容易爆栈(栈不易”控制”),BFS通过控制队列可以很好解决”爆队列”风险。
原文链接:https://blog.csdn.net/qq_43152052/article/details/99229105
原文地址:https://www.cnblogs.com/xym4869/p/12575831.html
- linux下用户操作记录审计环境的部署记录
- open-falcon ---客户机agent操作
- 双拼域名yansuan.com被木雨林收购
- open-falcon ---安装Dashboard时候报错"SSLError: The read operation timed out"
- Flash/Flex学习笔记(37):不用系统组件(纯AS3)的视频播放器--只有8.82K
- Flash/Flex学习笔记(35):如何正确监听Stage对象的事件
- Flash/Flex学习笔记(34):AS3中的自定义事件
- 字符串处理总结(旧)
- 计算某年某月的某一天是星期几的算法
- Flash/Flex学习笔记(33):如何用As3协同Flash CS IDE控制MovieClip实例
- live writer的折腾
- 用C语言写的万年历---亲手写的。好累哦
- Flash/Flex学习笔记(32):播放音乐并同步显示lyc歌词(适用于Silverlight)
- Flash/Flex学习笔记(31):对象拖拽与投掷
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- golang gctrace分析gc过程
- golang 标准库 time/rate 介绍
- golang map的并发读写导致panic
- 正则表达式
- redis设计与实现系列1-SDS
- LinkedList - 876. Middle of the Linked List
- Array - 48. Rotate Image
- string- 43. Multiply Strings
- Array - 34. Find First and Last Position of Element in Sorted Array
- Array - 31. Next Permutation
- Docker快速部署一个属于你自己的博客
- golang实现BST和AVL
- golang实现跳表(SkipList)
- 一致性哈希的golang实现
- Array - 75. Sort Colors