深度优先算法 和 宽度优先算法 的优缺点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度优先算法 和 宽度优先算法 的优缺点相关的知识,希望对你有一定的参考价值。
求助下 这是学人工智能时候遇到的问题 请大家哪位知道的帮忙解决下
可能是考试题啊 求助 求助
2、深度优先与广度优先的控制结构和产生系统很相似,唯一的区别在于对扩展节点选取上。由于其保留了所有的前继节点,所以在产生后继节点时可以去掉一部分重复的节点,从而提高了搜索效率。
3、这两种算法每次都扩展一个节点的所有子节点,而不同的是,深度优先下一次扩展的是本次扩展出来的子节点中的一个,而广度优先扩展的则是本次扩展的节点的兄弟点。在具体实现上为了提高效率,所以采用了不同的数据结构。 参考技术A 深度优先算法 首先我们来想象一只老鼠,在一座不见天日的迷宫内,老鼠在入口处进去,要从出 口出来。那老鼠会怎么走?当然是这样的:老鼠如果遇到直路,就一直往前走,如果遇到分叉路口,就任意选 择其中的一个继续往下走,如果遇到死胡同,就退回到最近的一个分叉路口,选择另一条道路再走下去,如果 遇到了出口,老鼠的旅途就算结束了。深度优先搜索法的基本原则就是这样:按照某种条件往前试探搜索,如 果前进中遭到失败(正如老鼠遇到死胡同)则退回头另选通路继续搜索,直到找到条件的目标为止。
广度优先算法(Breadth-First-Search),又称作宽度优先搜索,或横向优先搜索,简称BFS,是一种圆形搜索演算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点,如果发现目标,则演算终止。广度优先搜索的实现一般采用open-closed表。 参考技术B 研制出理想中的人工智能是我一生中的终极目标,本人现在高二,但却不知想学习人工智能到大学应该选什么专业,听说要到研究生才开始学,那本科生怎么办,望楼主指导一番
我也是在自学《人工智能基础教程》看到深度和广度优先算法时不解才百度到你的问题的,书上说广度优先算法优点是一定能找到最优解,但效率低,组合爆炸问题难以解决,深度优先算法是节省了大量的时间和空间,但不一定能找到最优解,因为在深度无限搜索树情况下可能不能停机。本人不解在深度优先搜索时不是要对每一个队列搜索到底然后再开始另一列的搜索吗?这怎么还会节省大量时间和空间呢???还有若最优解在搜索书的某无限队列的后端,则广度优先搜索不照样不能找到最优解吗?实在不解啊!!!!!
java数据结构与算法之二叉树的最大宽度和最大深度问题
①、最大深度问题
- 求二叉树的最大深度,最常见的无非两种方式
- 第一种是,以【宽度优先遍历】统计树的层数,树有多少层,那么树就有多高
- 第二种是,以【深度优先遍历】,以我们上面讲的【二叉树通用套路】,每个节点都可以向他的左右孩子要信息来求解
深度优先求树的最大高度解法
/**
* 以深度优先,求二叉树的高度
*/
public static int height(TreeNode treeNode)
if (treeNode == null)
return 0;
// 分别获取到左右孩子的树高度(问左右孩子要信息)
int left = height(treeNode.left);
int right = height(treeNode.right);
// 整合所有孩子的高度,以当前节点为头的二叉树的树高为左右孩子中最高的高度 + 1
return Math.max(left, right) + 1;
宽度优先求树的最大深度解法
/**
* 以宽度优先求二叉树的高度
* 该二叉树有多少层,那么就说明该树有多高,根据这个特性我们就可以使用宽度优先遍历来计算该树的层数,进而求得树的高度
*/
public static int height2(TreeNode treeNode)
if (treeNode == null)
return 0;
LinkedList<TreeNode> queue = new LinkedList<>();
HashMap<TreeNode, Integer> levelMap = new HashMap<>();
// 当前层
int currentLevel = 1;
queue.addLast(treeNode);
levelMap.put(treeNode, 1);
while (!queue.isEmpty())
TreeNode poll = queue.pollFirst();
// 节点出现了跨层,那么就把层数++
if (currentLevel != levelMap.get(poll))
currentLevel++;
// 处理孩子节点
if (poll.left != null)
levelMap.put(poll.left, levelMap.get(poll) + 1);
queue.addLast(poll.left);
if (poll.right != null)
levelMap.put(poll.right, levelMap.get(poll) + 1);
queue.addLast(poll.right);
return currentLevel;
②、最大宽度问题
- 最大宽度问题,最常使用的解法便是【借助队列】 + BFS,一层一层的遍历二叉树,并且记录好每一层的节点个数,节点个数最多的层,便是该树的最大宽度
- 通常我们使用的是【hash表 + BFS】来记录下每个节点所处的层数
- 然后使用BFS宽度优先遍历法,去统计每层的节点个数(每一层的宽度),最宽的那一层便是二叉树的最大宽度
public static int width(TreeNode treeNode)
if (treeNode == null)
return 0;
//队列
LinkedList<TreeNode> queue = new LinkedList<>();
// 存放层级关系的map
HashMap<TreeNode, Integer> levelMap = new HashMap<>();
// 树的最大宽度
int maxWidth = -1;
// 当前所在的层
int currentLevel = 1;
// 当前层的节点数量
int currentLevelCount = 0;
queue.addLast(treeNode);
// 先记录上每个节点所处的层
levelMap.put(treeNode, 1);
while (!queue.isEmpty())
TreeNode poll = queue.pollFirst();
// 节点没有跨层
if (currentLevel == levelMap.get(poll))
currentLevelCount++;
else
// 遇到第一个跨层的节点,先【结算上一层】节点个数和最大值,然后【重置当前层的节点个数为1个】
maxWidth = Math.max(maxWidth, currentLevelCount);
currentLevelCount = 1;
currentLevel++;
// 左右孩子分别入队列,并记录他们所处的层数
if (poll.left != null)
levelMap.put(poll.left, levelMap.get(poll) + 1);
queue.addLast(poll.left);
if (poll.right != null)
levelMap.put(poll.right, levelMap.get(poll) + 1);
queue.addLast(poll.right);
return maxWidth;
以上是关于深度优先算法 和 宽度优先算法 的优缺点的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )