回溯算法原理及其应用场景
回溯算法核心思想
回溯算法中的回溯意思是回到原来的地方,回:即回去,溯:逆流而上。
在这里,回溯算法是指回到上一步重新决策。
假设把一个人的一生量化,当他遇到人生的岔路口的时候,如果能选择最优的抉择,那么结果将达到人生的最优,用之前我们提到的贪心算法来决策的话,并不一定能得到人生的最优,因为贪心只是选择局部最优,而人生的每一个抉择都会影响未来。如果用回溯算法,将每一个岔路口的选择都做一遍,看看哪个组合是最好的,就可以找到这个人生的最优解了。
回溯算法的应用
回溯算法其实是一种穷举算法,将所有可能发生的情况都列举一遍,选择可行解或最优解。
要理解回溯算法的核心思想,就必须要以具体的例子来讲解,它的应用范围也非常广泛,不仅仅用于搜索算法中,类似数独、八皇后问题、全排列、0-1 背包、正则表达式匹配和编译原理中语法分析等
八皇后问题
首先我们来看一下如何用回溯算法来解决著名的八皇后问题,事实上回溯算法虽然能解决八皇后问题,但是效率却是最低的,八皇后问题之所以著名,是因为八皇后问题解法有多种,例如用位运算来解决八皇后问题,效率比回溯高很多。
八皇后问题,说的是在一个 8x8 的棋牌中,要摆放 8 个皇后,但是每个皇后的前后左右以及对角线上都不能有其他皇后,因为这几个方向是皇后的攻击方向。
其实很容易能够想到穷举所有的摆放方案就可以了,从第一行开始放,每次只能放在不会被攻击到的地方,遇到无解时,回到上层重新放。
最终代码如下,采用了递归来进行回溯。
int[] result = new int[8];// 下标表示行, 值表示Q存储在哪一列
public void cal8queens(int row) {if (row == 8) { // 8 个棋子都放置好了,打印结果printQueens(result);return;//已经找到解,返回继续寻找下一个解}for (int i=0; i<8; i++) { // 每一行都有 8 中放法if (isOk(row, i)) { // 判断皇后放在i列成不成result[row] = i; // 成的话记录第row行的棋子放到了i列cal8queens(row+1); // 继续放下一个皇后}}
}private boolean isOk(int row, int column) {//判断皇后放在这个位置成不成int leftup = column - 1, rightup = column + 1;for (int i = row-1; i >= 0; --i) { // 左上角,右上角和正上方方向检查是否存在皇后if (result[i] == column) return false; //向上考察if (leftup >= 0) { // 向左上考察if (result[i] == leftup)return false;}if (rightup < 8) { // 向右上考察if (result[i] == rightup)return false;}--leftup;++rightup;}return true;
}private void printQueens(int[] result) { // 打印解for (int row = 0; row < 8; ++row) {for (int column = 0; column < 8; ++column) {if (result[row] == column) {System.out.print("Q ");} else {System.out.print("* ");}}System.out.println();}System.out.println();
}
0-1 背包问题
0-1 背包是一个经典的动态规划问题,但是这里我们采用回溯算法来解决。
现在有一个背包,最高负重 W,有 n 个物品,每个物品重量不等,并且物品不可分割,即要么放要么不放。求能放进背包的物品的最大重量。
在讲贪心算法的时候这个背包问题中的物品的可分割的,因此只需要计算每个物品的单价,来决定放多少,而现在这个问题物品是不可分割的,因此无法使用贪心算法来解决了。
现在采用回溯算法解决,同样的也是将 n 个物品的放法穷举一遍,选择可以装进背包的最大重量,即 n 个物品有 2n 种放法,除去总重超过 W 的。
public int maxW = Integer.MIN_VALUE; // 记录背包中存放物品的最大重量
// cw 表示当前已经装进去的物品的重量和
// i 表示考察到哪个物品了;
// weight 表示每个物品的重量;
// n 表示物品个数
// w 背包重量;
public void solution(int i, int cw, int[] weight, int n, int w) {if (cw == w || i == n) { // 装满了或者已经考察到最后一个物品了 if (cw > maxW) maxW = cw;return;}solution(i+1, cw, items, n, w);//不放当前这个物品 if (cw + items[i] <= w) {// 若这个物品放的进背包 solution(i+1, cw + items[i], items, n, w);}
}
回溯算法原理及其应用场景相关推荐
- 八皇后回溯算法原理剖析及其JS实现
八皇后回溯算法(JS实现) 八皇后算法描述如下: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法! 下面来分析一波,假设此时我 ...
- 常用距离算法 (原理、使用场景、Python实现代码)
距离度量是有监督和无监督学习算法的基础,包括k近邻.支持向量机和k均值聚类等. 距离度量的选择影响我们的机器学习结果,因此考虑哪种度量最适合这个问题是很重要的.因此,我们在决定使用哪种测量方法时应该谨 ...
- 一文了解贪心算法和回溯算法在前端中的应用
一文了解贪心算法和回溯算法在前端中的应用 一.贪心算法 1.贪心算法是什么? 2.应用场景 3.场景剖析:零钱兑换 二.回溯算法 1.回溯算法是什么? 2.什么问题适合选用回溯算法解决? 2.应用场景 ...
- Apriori 算法原理以及python实现详解
Apriori 算法原理以及python实现 Apriori算法是第一个关联规则挖掘算法,也是最经典的算法.它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与 ...
- 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen
算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...
- 论文|SDNE的算法原理、代码实现和在阿里凑单场景中的应用说明(附代码)
1.概述 SDNE(Structural Deep Network Embedding)算法是发表在KDD-2016上的一篇文章,论文的下载地址为: https://www.kdd.org/kdd20 ...
- 论文|SDNE的算法原理、代码实现和在阿里凑单场景中的应用说明
1.概述 SDNE(Structural Deep Network Embedding)算法是发表在KDD-2016上的一篇文章,论文的下载地址为:https://www.kdd.org/kdd201 ...
- 非对称加密RSA算法原理及实际应用场景
非对称加密RSA算法原理及实际应用场景 引言 应用场景 RSA 算法原理 数学基础 质数 欧拉定理 模指数运算 小白理解 为什么需要足够大的质数 引言 我数学差的离谱,所以我朋友去学AI,我还在这搞这 ...
- 机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景
目录 引言 二.线性回归 三.逻辑回归 四.支持向量机 五.决策树 六.随机森林 七.K-均值聚类 八.主成分分析(PCA) 九.K近邻算法 十.朴素贝叶斯分类器 十一.神经网络 十二.AdaBoos ...
- c语言动态规划回溯的原理,「算法思想」分治、动态规划、回溯、贪心一锅炖...
观感度:????? 口味:东北一锅出 烹饪时间:10min 本文已收录在Github github.com/Geekhyt,感谢Star. 数据结构与算法系列专栏第四弹来袭,往期专栏链接如下: 初学者 ...
最新文章
- js的时间 java怎么处理,JS实现处理时间,年月日,星期的公共方法示例
- java500主键为空,java – JPA主键值始终为0
- iOS开发 UIPanGestureRecognizer手势抽象类
- 面向切面编程AOP的最佳入门示例
- Mysql事务以及加锁机制事务的特征ACID
- python123读取文本文件并排序输出_Python按字段对文本文件排序
- 手机能打开的表白代码_手机拍照还能加文字?打开这个自带按钮,一键就能添加方便...
- Flutter 登录页面Demo 复制可使用
- 苹果或于2020年开售iPhone SE2
- airtest adb 远程连接_使用Airtest超快速开发App爬虫
- hook监控限制_**CodeIgniter通过hook的方式实现简单的权限控制
- html黑洞效果,html5黑洞动画特效
- 看《吴峰光杀进 Linux 内核》
- 邮政网络与计算机网络的区别,邮政储蓄计算机网络系统分析与评价
- html立方体旋转展开,html5—旋转立方体
- LightGBM原理简介
- python整数和浮点数
- 如何修改linux文件生成日期,我如何更改文件的修改/创建日期?
- 飞机仓位区分代表的含义
- ChatGPT技术介绍
热门文章
- 全面了解三极管——三极管用作开关管1
- 三极管实现的锁存电路
- Java 设置添加ckeditor图片上传功能
- 2020switch电信最快的dns_《2020switch电信最快的dns》电影_2020switch电信最快的dns正片免费观看-深圳市创业发科技有限公司...
- 如何使用PowerShell批量删除注册表项
- VTK Learning Thirty - vtkPolyData to CGAL Surface_mesh
- 颜色代码大全 - RGB颜色查询对照表
- Android~adb卸载系统预装应用(亲测有效,android开发框架介绍
- Android11(R) system_ext 分区 system_ext_specific 属性
- 《路由器开发 - 路由器刷机指南》联想NWiFi3刷机