当前位置:首页 > 经验 >

回溯法基本思想(回溯法简介)

来源:原点资讯(www.yd166.com)时间:2022-10-30 23:02:29作者:YD166手机阅读>>

目录

  • 问题分析使用什么方法?什么是回溯法?怎么使用回溯法?回溯法的具体实施回溯法的延伸

给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:

Copy输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

问题分析#

使用什么方法?#

全排列很明显使用回溯法来进行解答

什么是回溯法?#

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

怎么使用回溯法?#

运用回溯法解题的关键要素有以下三点:

  1. 针对给定的问题,定义问题的解空间;
  2. 确定易于搜索的解空间结构;
  3. 深度优先方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。什么是深度优先搜索?#深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。

代码模板是什么样子的?#

Copyvoid BackTrace(int t) { if(t>n) Output(x); else for(int i = f (n, t); i <= g (n, t); i ) { x[t] = h(i); if(Constraint(t) && Bound (t)) BackTrace(t 1); } }

其中,t表示递归深度,即当前扩展结点在解空间树中的深度;n用来控制递归深度,即解空间树的高度。当t>n时,算法已搜索到一个叶子结点,此时由函数Output(x)对得到的可行解x进行记录或输出处理

用 f(n, t)和 g(n, t)分别表示在当前扩展结点处未搜索过的子树的起始编号和终止编号;h(i)表示在当前扩展结点处x[t]的第i个可选值;函数Constraint(t)和 Bound(t)分别表示当前扩展结点处的约束函数和限界函数。若函数Constraint(t)的返回值为真,则表示当前扩展结点处x[1:t]的取值满足问题的约束条件;否则不满足问题的约束条件。若函数Bound(t)的返回值为真,则表示在当前扩展结点处x[1:t]的取值尚未使目标函数越界,还需由BackTrace(t 1)对其相应的子树做进一步地搜索;否则,在当前扩展结点处x[1:t]的取值已使目标函数越界,可剪去相应的子树。

回溯法的具体实施#

Copyclass Solution { public List<List<Integer>> permute(int[] nums) { //LeetCode代码模板 } }

step 1 定义问题的解空间#

什么是解空间?

应用回溯法求解问题时,首先应明确定义问题的解空间,该解空间应至少包含问题的一个最优解。例如,对于有n种物品的 0-1 背包问题,其解空间由长度为n的 0-1 向量组成,该解空间包含了对变量的所有可能的0-1 赋值。当n=3时,其解空间是{ (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1) }
在定义了问题的解空间后,还需要将解空间有效地组织起来,使得回溯法能方便地搜索整个解空间,通常将解空间组织成树或图的形式。例如,对于n= 3的0-1 背包问题,其解空间可以用一棵完全二叉树表示,从树根到叶子结点的任意一条路径可表示解空间中的一个元素,如从根结点A到结点J的路径对应于解空间中的一个元素(1, 0, 1)。

定义本题的解空间

全排列问题,因为输入数组的长度为n = nums.length,解空间就是一个森林:

这里需要一个森林的图
假设n=4且nums[]={1,2,3,4}则解空间应该是
第一层:1 2 3 4
第二层:12 13 14 /21 23 24/31 32 34
第三层:123 124/132 134/213 214/231 234/241 243/312 314/.....
第四层:略

确定易于搜索的解空间结构

解空间主要对应的是子集树和排列树,依据题意进行选择。(根据题意画个图,就知道了)

什么是子集树???

子集树是一个数学学科词汇,属于函数类,当所给问题是从n个元素的集合S中找出S满足某种性质的子集时,相应的解空间称为子集树。
当所给问题是从n个元素的集合S中找出S满足某种性质的子集时,相应的解空间称为子集树。例如:n个物品的0-1背包问题所相应的解空间是一棵子集树,这类子集树通常有2^n个叶结点,其结点总数为(2^(n 1))-1。遍历子集树的算法通常需O(2^n)计算时间。

什么是排列树??

当所给问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。排列树通常有n!个叶子节点。因此遍历排列树需要O(n!)的计算时间。

上面已经确定,要将解空间构建成子集树的形式

step 2 回溯法的精髓#

回溯的精髓

退回原状态
如何回退是回溯的精髓,什么时候回退
就本题而言,第一躺全排列应该是1->2->3->4 ,当走到最后一步4之后,应该回退一步到1->2->3因为3只有一个分支4,再回退一步到1->2,然后满足了约束函数可以进行下一步1->2->4;
对于本题,回退到方法在于,标记未被访问的数组下标,回退则重制标记
因此可以使用一个visited[]数组,数组的长度为nums.length,被访问则对应的下标标记为true,否则标记为false;

step 3 回溯函数的设计#

void BackTrace(int t)只传递一个参数的话显然是无法满足本题的,因为本题包含了一下5个需要传递的参数:

  1. visited[] 数组;
  2. t 递归深度;
  3. List<List<Integer>> output 保存所有解的大容器
  4. List<Integer> save 保存解的小容器
  5. nums[]原始数据

因此,BackTrace应设计为:

Copypublic static void BackTrace( List<Integer> save, List<List<Integer>> out, boolean visited[], int nums[]) { if (save.size() == nums.length) { out.add(new ArrayList<>(save)); return; } else for (int i = 0; i < nums.length; i ) { if (visited[i]) continue; visited[i] = true; save.add(nums[i]); BackTrace( save, out, visited, nums); save.remove(save.size() - 1); visited[i] = false; } }

怎么写出这段代码需要结合前面的内容反复的思考 =-= 我想了好久才理清楚回溯的思路

回溯法的延伸#

子集问题
题目:

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
从上题中我们可以得出结论,这仍然是一道需要使用回溯法的题目。

解空间与解空间结构#

很明显这是一个子集数的解空间结构

假设n=3且nums[]={1,2,3}则解空间应该是
第一层:1 2 3
第二层:12 13/21 23/31 32
第三层:123 132/213 231/312 321/

关键性问题#

  1. 通过什么方法回退?
  2. 约束条件是什么?
  3. 去除重复对象
检测重复

检测重复首先想到的会是哈希表HashMap.因此每一次添加都应该在添加之前查找,如果找到重复则不存入;

约束条件是什么

约束条件应该还是当遍历到最后一个元素时退出?

通过什么方法回退?

由于集合的特殊性。不需要回退;

函数的设计:#

Copypublic static void BackTrack(int t,int[] nums, List<List<Integer>> out, List<Integer> save) { out.add(new ArrayList<>(save)); for (int i = t; i < nums.length; i ) { save.add(nums[i]); BackTrack(i 1,nums, out, save); save.remove(save.size()-1); } }

作者:Nikura44

出处:https://www.cnblogs.com/samanian/p/12194520.html

栏目热文

有效时间是指什么意思(尿液不能超过几小时化验)

有效时间是指什么意思(尿液不能超过几小时化验)

行政处罚的追诉时效,又称追责时效或者追究时效,是指行政机关对当事人违反行政管理秩序的行为,依法给予行政处罚的有效期限。若...

2022-10-30 22:36:18查看全文 >>

追溯历史还是回溯历史(目前中国可追溯到的最早历史)

追溯历史还是回溯历史(目前中国可追溯到的最早历史)

随着我国医院信息化管理建设的发展和深入,采用信息化技术实现CSSD管理,将成为医院CSSD发展的必然趋势。那么究竟一个好...

2022-10-30 22:42:26查看全文 >>

时间轨迹是什么意思(时间思维是什么意思)

时间轨迹是什么意思(时间思维是什么意思)

2022年10月10日10时55分,黑龙江齐齐哈尔市收到外省发来的协查信息:10月9日外省某市发现一名核酸检测阳性人员,...

2022-10-30 23:10:58查看全文 >>

回溯是什么意思呢(回溯怎么解释)

回溯是什么意思呢(回溯怎么解释)

质量回溯=根本原因分析与解决&持续改进。 由质量控制和质量回溯两者构成闭环。质量控制目的是质量水平的保持,质量回...

2022-10-30 22:31:54查看全文 >>

保险可回溯是什么意思(保险回溯环节)

保险可回溯是什么意思(保险回溯环节)

消费者在选购一些保险产品时,有时候会遇到“可回溯”环节,但是,在保险实务中,却有不少消费者因为各种原因对这一环节不是很重...

2022-10-30 23:00:27查看全文 >>

时光回溯是什么意思(地下城时光回溯打不动)

时光回溯是什么意思(地下城时光回溯打不动)

随着2月24日的到来,第4弹新春活动也是上线了!这弹新春活动上线的活动主要有4个,分别是赠送1个月斗神 CD药的5000...

2022-10-30 23:04:39查看全文 >>

重塑时间是什么意思(记忆重塑什么意思)

重塑时间是什么意思(记忆重塑什么意思)

文|于洪良从2014年7月到今年6月,8年间,我把自己在各类报刊发表的文章分门别类,汇编成册,为自己“攒”了两本书,分别...

2022-10-30 23:06:25查看全文 >>

什么叫时间节点(时间节点要记住吗)

什么叫时间节点(时间节点要记住吗)

说说时间和时间节点2021-06-27在文字没有出现之前,人们记事是用绳结的形式,大事打大结小事打小结,时间长了之后,人...

2022-10-30 23:03:31查看全文 >>

时间预测什么意思(未来预测是什么意思)

时间预测什么意思(未来预测是什么意思)

本篇文章将总结时间序列预测方法,并将所有方法分类介绍并提供相应的python代码示例,以下是本文将要介绍的方法列表:1、...

2022-10-30 22:46:27查看全文 >>

停留时间有什么意思(停留时间是什么意思)

停留时间有什么意思(停留时间是什么意思)

无论医学指南还是临床实际应用,每日服用一次阿司匹林即安全又可靠,可以说是最佳选择!关于阿司匹林的服用时间,由于其药物特性...

2022-10-30 22:42:38查看全文 >>

文档排行