算法之【回溯算法】详解(python)

简介: 算法之【回溯算法】详解(python)

定义


回溯算法实际上**基于DFS(深度优先搜索)**的一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回到上一个状态,尝试其他的路径,这种走不通就退回再走的技术为回溯法;满足回溯条件的某个状态的点称为“回溯点”。


回溯相关问题


  1. DFS 和回溯算法区别


DFS 是一个劲的往某一个方向搜索,直到到达最底层,而回溯算法建立在 DFS 基础之上的,但不同的是在搜索过程中,达到结束条件后,恢复状态,回溯上一层,再次搜索。因此回溯算法与 DFS 的区别就是有无状态重置


  1. 何时使用回溯算法


当问题碰到走不通的路径,需要"回头",以此来查找出所有的解的时候,使用回溯算法。即满足结束条件或者发现不是正确路径的时候(走不通),要撤销选择,回退到上一个状态,继续尝试,直到找出所有解为止。


  1. 回溯算法的基本步骤


  • 找到状态变量(回溯函数的参数)
  • 依据题意定义递归结束条件
  • 找准选择列表(与函数参数相关),与第一步紧密关联
  • 判断是否需要剪枝,即提前将不符合条件的路径排除掉
  • 作出选择,递归调用,进入下一层
  • 撤销选择



  1. 回溯算法类的题型有哪些


  • 子集、组合类问题
  • 排列类问题
  • 搜索、N皇后类问题、


注意:子集、组合是无关顺序的,而排列是和元素顺序有关的,如 [1,2] 和 [2,1] 是同一个组合(子集),但 [1,2] 和 [2,1] 是两种不一样的排列!!!!


回溯算法的通用模板


result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择


题目举例


Leetcode78.子集


问题描述


给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

**说明:**解集不能包含重复的子集。


示例


输入: nums = [1,2,3]

输出:

[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

[]

]


python代码题解


套用上述回溯算法的模板,path表示已选择的路径,for i in range(start, len(nums))表示当前能够选择的列表元素,注意对于组合类问题不能够选择前面已经选择过的元素,因为会存在重复结果,因此必须有一个start参数来控制每一轮能够选择的元素[start, len(nums)]。


class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        def backtrack(nums, path, start):
            # 将path添加到res结果中
            res.append(path.copy())
            # 当前能够选择的参数列表
            for i in range(start, len(nums)):
                # 做选择
                path.append(nums[i])
                backtrack(nums, path, i+1)
                # 撤销选择
                path.pop()
        res = []
        backtrack(nums, [], 0)
        return res


Leetcode77.组合


问题描述


给定两个整数 nk,返回 1 … n 中所有可能的 k 个数的组合。


示例


输入: n = 4, k = 2

输出:

[

[2,4],

[3,4],

[2,3],

[1,2],

[1,3],

[1,4],

]


python代码题解


本题与上一题基本相同,都是属于组合类问题,只是递归的终止条件不同,本题的终止条件是当路径长度为k时len(track) == k,将结果添加到res中。


套用上述回溯算法的模板,track表示已选择的路径,for i in range(start, n+1)表示当前能够选择的列表元素,注意start是从1开始的,应为题目中指明能够选择的数为1...n。


class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        # 数的选择范围在1-n
        def backtrack(n,k,start,track):
            if len(track) == k:
                res.append(track.copy())
                return
            # 注意i从start开始递增
            for i in range(start, n+1):
                # 做选择
                track.append(i)
                backtrack(n,k,i+1,track)
                # 撤销选择
                track.pop()
        res = []
        track = []
        backtrack(n,k,1,track)
        return res


通过上述讲解,读者应该对回溯算法的概念以及模板套路有一个基本的认识,回溯的关键在于选择与撤销选择的过程,读者可以仔细体会一下 ,相信一定会有所收获。后续会继续更新关于回溯算法的相关题解,欢迎持续关注!

相关文章
|
3天前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
34 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
1月前
|
机器学习/深度学习 数据采集 算法
【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现
本文介绍了一个基于Python的时间序列模型,用于分析和预测2021-2022年重庆地区的气温变化趋势,通过ARIMA和LSTM模型的应用,揭示了气温的季节性和趋势性变化,并提供了对未来气温变化的预测,有助于气象预报和相关决策制定。
【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现
|
14天前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
76 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
15天前
|
算法 数据处理 数据安全/隐私保护
|
29天前
|
编解码 算法 Linux
Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析
在对接Linux平台的RTSP播放模块时,需将播放数据同时提供给Python进行视觉算法分析。技术实现上,可在播放时通过回调函数获取视频帧数据,并以RGB32格式输出。利用`SetVideoFrameCallBackV2`接口设定缩放后的视频帧回调,以满足算法所需的分辨率。回调函数中,每收到一帧数据即保存为bitmap文件。Python端只需读取指定文件夹中的bitmap文件,即可进行视频数据的分析处理。此方案简单有效,但应注意控制输出的bitmap文件数量以避免内存占用过高。
|
28天前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
30天前
|
JSON 算法 API
京东以图搜图功能API接口调用算法源码python
京东图搜接口是一款强大工具,通过上传图片即可搜索京东平台上的商品。适合电商平台、比价应用及需商品识别服务的场景。使用前需了解接口功能并注册开发者账号获取Key和Secret;准备好图片的Base64编码和AppKey;生成安全签名后,利用HTTP客户端发送POST请求至接口URL;最后解析JSON响应数据以获取商品信息。
|
29天前
|
算法 Python
python多继承的3C算法是什么?怎么用?
有很多地方都说python多继承的继承顺序,是按照深度遍历的方式,其实python多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫3C算法
|
1月前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
159 1
|
1月前
|
数据采集 机器学习/深度学习 算法
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】