回溯法

189 篇文章 0 订阅
162 篇文章 0 订阅

 递归调用结束之后,总是会返回上一层继续调用。每一层的递归调用,都是如此,要逐步地返回,直到根节点的那次递归调用的所有可能尝试完成,整个的递归调用才结。也正是因为如此,我们这种递归调用来寻找答案的过程通常也被称之为回溯。

 

 

 

也就是说沿着一条路径寻找答案,一旦找到答案的话,或者也有可能一旦没有找到答案的话,不管怎么样,一旦递归到底的话,就回去,继续去寻找,依次类推,这个过程就叫回溯。从这个概念来看的话,和树相关的算法,本质也是回溯,因为使用了递归。递归的话,就是要返回,只不过回溯法这样一个名词,通常被用来这个问题是用来查找。所以会经常听说用回溯法来搜索整棵树,查找某个问题的解。

 

递归法、回溯法的复杂度。以该题为例,假设给定的数字字符串为n的话,这个算法的复杂度,大概是n的3次方。为什么说是大概是3的n次方呢?假设一个数字代表三个字母的话,当然这里7和9可以代表4个字母,而0这个数字只能代表1个字母,不考虑这种特殊的情况。平均来看,大概每个数字都能代表3个字母,在这种情况下大概有n个数字,这个解就是3的n次方,一个常数的n次方这样的算法,时间复杂度都被成为O(2^n)。比如前面的O(log2^n)与O(log3^n)这两个算法的复杂度其实只相差了一个常数,同理的O(2^n)和O(3^n)这两个也只相差了一个常数,不管怎样,它都是一个指数级的算法,也正因为如此,这种回溯法它的效率通常是非常低的。以该题为例,它能处理的字符串长度,对于一般的家用计算机而言,最大,n也就等于20。那么,之前像排序,能够处理几万、几十万、甚至几百万的数据,使用这种方法是绝对不可以的。

 

我们可以换一个角度来理解2^n这个时间复杂度,对于下面这棵树,是以指数级上升的。第0层有1个节点,第1层有3个节点,第2层有9个节点,依次类推,我们整个算法要在整棵树中进行遍历,最终达到每一个叶子节点,从下图可以看出,到达叶子节点后,节点数就是3^n,所以也可以佐证算法复杂度是一个指数级的复杂度,称之为O(2^n)这样的一个算法复杂度。这样的算法,其实它的效率非常低,但是回溯法其实是暴力解法的一种主要实现手段。我们遇到的很多问题,我们如果想要枚举其所有的解的话,如果不能使用简单的循环遍历的话,就需要使用这种回溯法。对于这个问题,它的特点是什么?它的特点是n是一个变量,我们不知道给定的这个数字字符串长度是多少,如果它的长度是固定的,比如说它的长度就是8,那么就可以使用8重循环来枚举它的可能性。但是现在它的长度是未知的,就可以使用这种回溯法来枚举所有的可能性。在算法面试的时候,如果没有思路,不妨尝试一下暴力的解法,对于暴力解法来说,多重循环是一种方式,可是有的题目不适用多重循环,此时很有可能就要使用回溯法。很多更高级的算法,比如说,动态规划这种算法,它的本质其实是在回溯法的基础上进行改进的,依然要发现像回溯法这样的递归结构,同时,还要满足其它的特殊的性质,就可以使用动态规划法。有一些问题只能使用回溯法这种暴力解法,但是在使用回溯法的过程中,可以通过剪枝,不用到达所有的叶子节点,从而提升算法效率。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值