回溯算法核心思想

回溯算法中的回溯意思是回到原来的地方,回:即回去,溯:逆流而上。

在这里,回溯算法是指回到上一步重新决策。

假设把一个人的一生量化,当他遇到人生的岔路口的时候,如果能选择最优的抉择,那么结果将达到人生的最优,用之前我们提到的贪心算法来决策的话,并不一定能得到人生的最优,因为贪心只是选择局部最优,而人生的每一个抉择都会影响未来。如果用回溯算法,将每一个岔路口的选择都做一遍,看看哪个组合是最好的,就可以找到这个人生的最优解了。

回溯算法的应用

回溯算法其实是一种穷举算法,将所有可能发生的情况都列举一遍,选择可行解或最优解。

要理解回溯算法的核心思想,就必须要以具体的例子来讲解,它的应用范围也非常广泛,不仅仅用于搜索算法中,类似数独、八皇后问题、全排列、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);}
}

回溯算法原理及其应用场景相关推荐

  1. 八皇后回溯算法原理剖析及其JS实现

    八皇后回溯算法(JS实现) 八皇后算法描述如下: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法! 下面来分析一波,假设此时我 ...

  2. 常用距离算法 (原理、使用场景、Python实现代码)

    距离度量是有监督和无监督学习算法的基础,包括k近邻.支持向量机和k均值聚类等. 距离度量的选择影响我们的机器学习结果,因此考虑哪种度量最适合这个问题是很重要的.因此,我们在决定使用哪种测量方法时应该谨 ...

  3. 一文了解贪心算法和回溯算法在前端中的应用

    一文了解贪心算法和回溯算法在前端中的应用 一.贪心算法 1.贪心算法是什么? 2.应用场景 3.场景剖析:零钱兑换 二.回溯算法 1.回溯算法是什么? 2.什么问题适合选用回溯算法解决? 2.应用场景 ...

  4. Apriori 算法原理以及python实现详解

    Apriori 算法原理以及python实现 ​ Apriori算法是第一个关联规则挖掘算法,也是最经典的算法.它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与 ...

  5. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

  6. 论文|SDNE的算法原理、代码实现和在阿里凑单场景中的应用说明(附代码)

    1.概述 SDNE(Structural Deep Network Embedding)算法是发表在KDD-2016上的一篇文章,论文的下载地址为: https://www.kdd.org/kdd20 ...

  7. 论文|SDNE的算法原理、代码实现和在阿里凑单场景中的应用说明

    1.概述 SDNE(Structural Deep Network Embedding)算法是发表在KDD-2016上的一篇文章,论文的下载地址为:https://www.kdd.org/kdd201 ...

  8. 非对称加密RSA算法原理及实际应用场景

    非对称加密RSA算法原理及实际应用场景 引言 应用场景 RSA 算法原理 数学基础 质数 欧拉定理 模指数运算 小白理解 为什么需要足够大的质数 引言 我数学差的离谱,所以我朋友去学AI,我还在这搞这 ...

  9. 机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景

    目录 引言 二.线性回归 三.逻辑回归 四.支持向量机 五.决策树 六.随机森林 七.K-均值聚类 八.主成分分析(PCA) 九.K近邻算法 十.朴素贝叶斯分类器 十一.神经网络 十二.AdaBoos ...

  10. c语言动态规划回溯的原理,「算法思想」分治、动态规划、回溯、贪心一锅炖...

    观感度:????? 口味:东北一锅出 烹饪时间:10min 本文已收录在Github github.com/Geekhyt,感谢Star. 数据结构与算法系列专栏第四弹来袭,往期专栏链接如下: 初学者 ...

最新文章

  1. js的时间 java怎么处理,JS实现处理时间,年月日,星期的公共方法示例
  2. java500主键为空,java – JPA主键值始终为0
  3. iOS开发 UIPanGestureRecognizer手势抽象类
  4. 面向切面编程AOP的最佳入门示例
  5. Mysql事务以及加锁机制事务的特征ACID
  6. python123读取文本文件并排序输出_Python按字段对文本文件排序
  7. 手机能打开的表白代码_手机拍照还能加文字?打开这个自带按钮,一键就能添加方便...
  8. Flutter 登录页面Demo 复制可使用
  9. 苹果或于2020年开售iPhone SE2
  10. airtest adb 远程连接_使用Airtest超快速开发App爬虫
  11. hook监控限制_**CodeIgniter通过hook的方式实现简单的权限控制
  12. html黑洞效果,html5黑洞动画特效
  13. 看《吴峰光杀进 Linux 内核》
  14. 邮政网络与计算机网络的区别,邮政储蓄计算机网络系统分析与评价
  15. html立方体旋转展开,html5—旋转立方体
  16. LightGBM原理简介
  17. python整数和浮点数
  18. 如何修改linux文件生成日期,我如何更改文件的修改/创建日期?
  19. 飞机仓位区分代表的含义
  20. ChatGPT技术介绍

热门文章

  1. 全面了解三极管——三极管用作开关管1
  2. 三极管实现的锁存电路
  3. Java 设置添加ckeditor图片上传功能
  4. 2020switch电信最快的dns_《2020switch电信最快的dns》电影_2020switch电信最快的dns正片免费观看-深圳市创业发科技有限公司...
  5. 如何使用PowerShell批量删除注册表项
  6. VTK Learning Thirty - vtkPolyData to CGAL Surface_mesh
  7. 颜色代码大全 - RGB颜色查询对照表
  8. Android~adb卸载系统预装应用(亲测有效,android开发框架介绍
  9. Android11(R) system_ext 分区 system_ext_specific 属性
  10. 《路由器开发 - 路由器刷机指南》联想NWiFi3刷机