回溯法排序树怎么画_回溯,入门

本文介绍了回溯法的概念,强调它是深度优先搜索(DFS)的一个应用场景,具有回溯和撤销选择的特点。通过全排列问题为例,讲解了如何使用递归和回溯法解决此类问题,并提供了代码模板。同时,提到了剪枝操作在优化回溯法效率中的重要性,以避免指数级别的计算复杂度。此外,还分享了相关题目和解题思路,帮助读者深入理解和实践回溯法。
摘要由CSDN通过智能技术生成

说回溯之前,得先知道dfs,说dfs得知道什么是搜索算法。
最常见,常用的搜素算法:

  • 广度优先搜索(bfs:Breadth First Search)
  • 深度优先搜索(dfs: Depth First Search)

这两种算法在经典的N叉树遍历算法上有最熟悉不过的应用。
比如使用队列层次遍历二叉树就基于bfs,递归方式的前中后序遍历就基于dfs。
当然dfs和bfs有除此之外更加复杂的应用场景。

对于回溯,我的理解就是基于dfs,深度优先搜索上的一种应用场景。
它的重要特点,也就是它的名字,回溯,回溯在搜索到某一层的某一分支之后,如果不满足条件后,就回退,撤销选择,尝试别的分支,直到找到符合结果。

回溯具体代码实现,主要通过递归来实现,因回溯的特点,其代码大部分有极高的对称性。
深度搜索的话,其实就相当于把所有可能的分支都要走一遍,所以朴素回溯,其时间复杂度一般是指数级别的,因为回退尝试,产生很多中间重复计算。这个时候,就需要合理的剪枝操作,来优化提高程序运行速度。但是剪枝一般不会影响时间复杂的大的量级。

回溯的关键字:回退,撤销选择,递归,dfs,剪枝。

分析回溯类题目,画出递归状态树就行,然后分析如何回退,如何剪枝。时间复杂度计算就分析总的递归的时间

回溯的代码模板:

public void dfs(当前路径, 当前层级,选择列表,结果集) {
    
    // 1. 终止条件
    if(符合条件) {
        当前路径加入结果集
        return;
    }
    // 2. 处理当前层
    cur.add(...);
    // 3. 下探,递归
    dfs(cur,level + 1, 选择列表,结果集);
    // 4. 回退,撤销选择
    cur.remove(...);
}

分享两篇我认为比较好的回溯文章:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值