回溯法(复习笔记一)

目录

前言

回溯法引入:

一、回溯法

二、实例分析

数字组合问题

三、基本步骤

回溯法的基本步骤:

剪枝的正确性:

※重点提醒

四、深度剖析

递归算法:

非递归算法:

总结


前言

回溯法引入:

搜索法是解决问题时常用的方法,最笨的办法是穷举搜索,对于有些问题穷举搜索可以有效的解决,但是对于复杂问题穷举搜索法就不能很好地解决了。因此,在穷举搜索的基础上,提出了一些启发式的搜索方法。        

回溯法的本质就是搜索,但是其搜索过程采用了一些“剪枝”的策略,可以一定程度上提高搜索的效率。回溯法也称为试探法,该方法在搜索过程中会向前试探搜索,也会在当前搜索路径走不通时,向后回溯。


一、回溯法

适用回溯法求解的问题            

可用回溯法求解的问题P,通常要能表达为:  

⭐ 对于已知的由n元组(x1,x2,…,xn)组成的一个状态空间E={(x1,x2,…,xn)∣xi∈Si ,i=1,2,…,n},状态空间E成为问题的解空间;

⭐   给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域,且 |Si| 有限,i=1,2,…,n。

⭐   我们称E中满足D的全部约束条件的任一n元组为问题P的一个解。    

⭐注意,同一问题的解空间可能会有多种定义方式,要选择更简单,效率更高的方式。

二、实例分析

数字组合问题

问题描述:找出从自然数1、2、……、n中任取r个数的所有组合。

  例如n=5,r=3的所有组合为:  

  (1) 1、2、3    (2) 1、2、4     (3) 1、2、5 (4) 1、3、4    (5) 1、3、5    

  (6) 1、4、5 (7) 2、3、4    (8) 2、3、5     (9) 2、4、5 (10) 3、4、5

  则该问题的状态空间为: E={(x1,x2,x3)∣xi∈S ,i=1,2,3 }  

  其中:S={1,2,3,4,5}    约束集为:   x1<x2<x3

三、基本步骤

回溯法基本步骤:

(1)针对所给问题,定义问题的解空间;

(2)确定易于搜索的解空间结构;

(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

常用剪枝函数

用约束函数在扩展结点处剪去不满足约束的子树;

用目标函数剪去得不到最优解的子树。(优化问题)

剪枝的正确性:

●    对于许多问题,所给定的约束集D具有完备性,即i元组(x1,x2,…,xi)满足D中仅涉及到x1,x2,…,xi的所有约束意味着j(j<i)元组(x1,x2,…,xj)一定也满足D中仅涉及到x1,x2,…,xj的所有约束,i=1,2,…,n。

●   换句话说,只要存在0≤j≤n-1,使得(x1,x2,…, xj)违反D中仅涉及到x1,x2,…,xj的约束之一,则以(x1,x2,…,xj)为前缀的任何n元组(x1,x2,…,xj,xj+1,…,xn)一定也违反D中仅涉及到x1,x2,…,xi的一个约束,n≥i>j。

●    因此,对于约束集D具有完备性的问题P,一旦检测断定某个j元组(x1,x2,…,xj)违反D中仅涉及x1,x2,…,xj的一个约束,就可以肯定,以(x1,x2,…,xj)为前缀的任何n元组(x1,x2,…,xj,xj+1,…,xn)都不会是问题P的解,因而就不必去搜索它们、检测它们。

●   回溯法正是针对这类问题,利用这类问题的上述性质而提出来的比枚举法效率更高的算法。

※重点提醒

  •   回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。
  •   回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。  
  •   回溯法在用来求问题的最优解时,要回溯到根,且根结点的所有子树都已被搜索遍,保留问题的目标函数值最优的解。

  回溯算法中用到的几个概念:            

  1.  如果已经搜索到的结点全部满足问题的约束条件,但搜索还没有到达空间树的叶子节点,则称为部分解
  2.  如果从根到当前节点的路径对应于问题的一个合法解,过程就终止(除非问题没有解)。      
  3.  如果这条路径的长度小于n,并且相应的解是部分的,那么就生成现节点的一个子节点,并将它标记为现节点(活节点)。        
  4. 如果对应的路径不是部分的,那么现节点标识为死节点。        
  5. 回溯算法有递归形式和非递归形式两种。

四、深度剖析

问题描述:        

找出从自然数1、2、……、n中任取r个数的所有组合。

问题的状态空间为  E={(x1,x2,...,xr)∣xi∈S ,i=1,2,...,r }        

其中: S={1,2,3,...,n}       约束集为:   x1<x2<... <xr

递归算法:
INPUT: n个数分别为{1,2,…n},r。
OUTPUT: n个数的所有r组合。1.    for  k =1 to r2.         c[k] =03.    end for4.    k =15.    while k≥16.          while c[k]≤n-17.                 c[k] =c[k]+18.                 if c为合法的  then得到一个r组合,输出c数组9.                 else if c是部分解 then k =k+110.         end while11.         c[k] =012.         k =k-113.  end while 
非递归算法:
INPUT: n个数分别为{1,2,…n},r。
OUTPUT: n个数的所有r组合。1.    for  k =1 to r2.         c[k] =03.    end for4.    k =15.    while k≥16.          while c[k]≤n-17.                 c[k] =c[k]+18.                 if c为合法的  then得到一个r组合,输出c数组9.                 else if c是部分解 then k =k+110.         end while11.         c[k] =012.         k =k-113.  end while 

总结

 这两个算法的复杂性在最坏情况下生成了O(nr)个节点。对于每个生成的节点,如果当前解是合法的、部分的,或者两者都不是,这需要O(r)的工作来检查。因此,最坏情况下,全部的运行时间是O(rnr)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt学习笔记

qt的对象树 在 Qt中创建对象的时候会提供一个 Parent 对象指针&#xff0c;Q0bject是以对象树的形式组织起来的。 当你创建一个 Q0biect 对象时&#xff0c;会看到 Q0biect 的构造函数接收一个Q0b.ject指针作为参数&#xff0c;这个参数就是 parent&#xff0c;也就是父对象指…

Typescript高级: 深入理解infer关键字

概述 在 TS 中&#xff0c;infer 是一个高级类型操作&#xff0c;特别是条件类型和映射类型中非常有用的关键字它在泛型中使用也会是一个强大工具&#xff0c;增强了类型推断的能力&#xff0c;让开发者更灵活地处理和操作类型它允许在泛型类型推导过程中捕获一个具体的类型&a…

三次样条插值的实现(Matlab)

一、问题描述 三次样条插值的实现。 二、实验目的 掌握三次样条插值方法的原理&#xff0c;能够编写代码获得自然、抛物线端点以及非纽结三次样条。 三、实验内容及要求 找出并画出三次样条S&#xff0c;满足S(0) 1, S(1) 3, S(2) 3, S(3) 4, S(4) 2&#xff0c;其中…

Spring Boot 开发 -- 过滤器与拦截器详解

引言 在Web开发中&#xff0c;经常需要对请求进行预处理或在响应后进行后处理&#xff0c;Spring Boot提供了过滤器和拦截器两种机制来实现这一需求。虽然它们都可以用来处理HTTP请求和响应&#xff0c;但在使用场景、执行顺序和配置方式上存在明显的差异。本文将详细讲解Spri…

LeetCode 2928.给小朋友们分糖果 I:Java提交的运行时间超过了61%的用户

【LetMeFly】2928.给小朋友们分糖果 I&#xff1a;Java提交的运行时间超过了61%的用户 力扣题目链接&#xff1a;https://leetcode.cn/problems/distribute-candies-among-children-i/ 给你两个正整数 n 和 limit 。 请你将 n 颗糖果分给 3 位小朋友&#xff0c;确保没有任何…

【面试宝藏】Go基础面试题其一

探索Go语言&#xff1a;特性、用法与最佳实践 Go语言&#xff08;Golang&#xff09;自发布以来迅速成为开发者社区中的热门选择。本文将探讨Go语言的优势、数据类型、包管理、类型转换、并发处理、同步机制、通道特性及其使用中的注意事项等内容&#xff0c;并回答一些常见的…

微信小程序的事件绑定方式

微信小程序的事件绑定方式主要包括以下几种&#xff0c;每种方式都有其特定的用法和特性&#xff1a; 基础绑定方式&#xff1a; bind&#xff1a;这是最基础的绑定方式&#xff0c;用于绑定事件处理函数。例如&#xff0c;bindtap用于绑定点击事件。当组件触发事件时&#xf…

易语言贪吃蛇游戏(附带源码)

易语言贪吃蛇游戏 效果图源码说明源码领取下期更新预报 效果图 源码说明 本源码用易语言来编写&#xff0c;供大家研究&#xff0c;保留版权&#xff0c;谢谢&#xff01; 源码领取 易语言贪吃蛇游戏源码领取地址&#xff1a;https://www.123pan.com/s/ji8kjv-TKPU3.html提取…

Oracle中rman的增量备份使用分享

继上次使用RMAN的全量备份和异机还原以后&#xff0c;开始研究一下增量备份和还原的方法。相比于全量RMAN的备份还原&#xff0c;增量的备份还原就相对简单。本实践教程直接上操作&#xff0c;还是回归到一个问题&#xff0c;就是关于两个数据库创建时候&#xff0c;必须保持or…

泄漏libc基地址

拿libc基地址 方法一&#xff1a;格式化字符串 格式化字符串&#xff0c;首先确定输入的 AAAA 在栈上的位置&#xff08;x&#xff09;。使用 elf.got[fun] 获得got地址。利用格式化字符串&#xff0c;构造payload泄漏got地址处的值&#xff0c;recv接受到的字符串中&#xf…

linux部署运维1——centos7.9离线安装部署web或java项目所需的依赖环境,包括mysql8.0,nginx1.20,redis5.0等工具

在实际项目部署运维过程中&#xff0c;如果是云服务器&#xff0c;基本安装项目所需的依赖环境都是通过yum联网拉取网络资源实现自动化安装的&#xff1b;但是对于一些特殊场合&#xff0c;在没有外部网络的情况下&#xff0c;就无法使用yum命令联网操作&#xff0c;只能通过编…

网络报文协议头学习

vxlan&#xff1a;就是通过Vxlan_header头在原始报文前面套了一层UDPIP&#xff08;4/6&#xff09;Eth_hdr 需求背景&#xff1a;VXLAN&#xff1a;简述VXLAN的概念&#xff0c;网络模型及报文格式_vxlan报文格式-CSDN博客 如果服务器作为VTEP&#xff0c;那从服务器发送到接…

jmeter之MD5加密请求秒杀接口教程

前言&#xff1a; 有时候在项目中&#xff0c;需要使用MD5加密的方法才可以登录&#xff0c;或者在某一个接口中遇到 登录获取token后才可以进行关联&#xff0c;下面介绍下遇到的常见使用 一、第一种方法&#xff1a;使用jmeter自带的函数助手digest 选择工具&#xff0c;选…

并查集拓展(扩展域并查集)

事实证明&#xff0c;扩展域并查集应该在带权并查集前面讲的&#xff0c;因为比较好理解&#xff0c;而且回过头看带权并查集可能也会更轻松一些。 https://www.luogu.com.cn/problem/P1892https://www.luogu.com.cn/problem/P1892 题目描述 现在有 &#x1d45b; 个人&…

矩阵转置(函数)

题目描述 写一个函数&#xff0c;使给定的一个二维数组&#xff08;&#xff13;&#xff13;&#xff09;转置&#xff0c;即行列互换。 输入 一个3x3的矩阵 输出 转置后的矩阵 // 输入示例&#xff1a; 1 2 3 4 5 6 7 8 9 输出示例&#xff1a; 1 4 7 2 5 8 3 6 9…

算法解析——单身狗问题

欢迎来到博主的专栏&#xff1a;算法解析 博主ID代码小豪 文章目录 什么是单身狗问题leetcode_136——只出现一次的数字I使用位运算解决单身狗问题。 leetcode_137——只出现一次的数字II统计二进制数解决单身狗问题leetcode_260 只出现一次数字III分区域按位异或解决问题。 总…

C语言:如何写文档注释、内嵌注释、行块注释?

技术答疑流程 扫描二维码&#xff0c;添加个人微信&#xff1b;支付一半费用&#xff0c;获取答案&#xff1b;如果满意&#xff0c;则支付另一半费用&#xff1b; 知识点费用&#xff1a;10元 项目费用&#xff1a;如果有项目任务外包需求&#xff0c;可以微信私聊

微信小程序怎么注册账号

要注册微信小程序账号&#xff0c;你需要遵循以下步骤&#xff1a; 访问微信公众平台&#xff1a; 首先&#xff0c;你需要访问微信公众平台的官方网站&#xff08;https://mp.weixin.qq.com/&#xff09;。 注册或登录&#xff1a; 如果你已经有一个微信公众平台账号&#xf…

【scikit-learn009】异常检测系列:单类支持向量机(OC-SVM)实战总结(看这篇就够了,已更新)

1.一直以来想写下机器学习训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架OCSVM模型相关知识体系。 3.欢迎批评指正,欢迎互三,跪谢一键三连! 4.欢迎…

Bev任务issue汇总

1. Bev grid 网格的大小,输入网络的图像的大小,前后左右的感知距离多大? Bev网格大小在通常设置为0.4*0.5; 感知距离:(横向)左右距离(20m);(纵向) -30m(后)~110m(前), 超过110米其实效果就已经很差了,90米距离效果也比较差。 2. 车道线属性分类任务用什么 Loss 车道线检…