回溯法的根本思想

对于一个问题求解过程中不断地去依据现在的状态,遍历下一个可能状态的集合。

这里要保存的东西有:

  1. 所有的历史路径
  2. 每一个路径可能去的下一路径的集合。

这种记忆方式的产生原因:是考虑所有的状态与状态之间有时间的先后顺序。

整个递归树的遍历点的路径画出来之后,看上去就很麻烦。

所以复杂性(不是复杂度)来自于这种路径而不是树本身。因为问题的解空间确定了,在解空间中寻找一个或多个解。那么算法的复杂性来源于如何在解中选择。这个时候思考问题的时候不能仅仅把解空间看作数学定义的那样,是一个线性表。因为问题本身是树型的,把树型的解的形状压缩为线性的形状是要付出代价的。

而这种代价的支付方式可能是预处理,如果这种预处理能把例如复杂度是 n3 压缩为两个 n2 当然是最好的。当然也有可能存在别的压缩方式,或者是复杂的变换。

注意:这里提到过解的形状。解的形状往往是我们所忽略的,在大部分情况中我们会忽略,因为形状本身不会影响。但是有的时候形状本身就会产生影响。对于解的形状想要了解更多,推荐阅读 SICP 这本魔法书

递归下降

在使用回溯法的时候,一种简单的实现方法就是使用递归遍历。但是在很多时候递归的性能不是很好。所以有人想出来了递归下降。

递归下降是一种十分直接暴力的方法,其根本思想就是取消每次当前状态和下一状态的来回移动。其实在算法之中就提到过这个递归算法的学名:bound function。这是其实就是如果当前状态的子树空间中不包含待找元素直接就不找了。

这就砍掉了一大部分的路径。

LL(1)分析算法

这个算法就是另一种对回溯的优化尝试。

LL(1)分析算法是一种表驱动算法。(这里我个人认为也是是 SICP中提到的流处理

这里表处理的方式就是把解空间降维,(表的构造过程和查表找下一状态的过程,就是付出的代价)

这样,表处理就会完成这样一个操作。

  1. 先构造表
  2. 利用表一个元素一个元素的求解。

看上去原本的时间顺序不见了,上下点的联系也不见了。

但是事实上,其实还存在,但是存在的地点改变了。或者说是外移了。把联系外移给了。但是表的联系是被记录好的。所以消除了一定的复杂性。

那么联系外移了,时间顺序呢?

时间顺序被表抹去了,因为其实这种时间的逻辑是不必须的。(SICP中提到过,事物的顺序逻辑和实际编码的顺序逻辑可以没有必然的映射关系)。

分析一下原本时间顺序的逻辑:路径访问过程中,下一状态的值的空间由上一状态或者历史状态决定。这就是时间顺序的来源。是因为递归的思维中就隐含的潜在意义:历史决定了未来

历史真的决定了未来吗

把目光再看回编译原理,我们可以找到很多例子可以表明:如果一个状态的推导不仅仅尤其本身,影响的因素可能是其他推导式。明确是其他推导式而不是历史状态 因为这是两种不同的思维方式。像DP算法,就是有明确的时间顺序,但是更多的时候我们不应该去关注整个模块的细节,而是模块和模块之间的交互。
数据在模块和模块之间流动,这就是流处理。

之所以我们用计算机描述真实世界这么困难,可能是我们理解世界的方式出现了问题

关于流处理,我会在后面进一步的分析,但不是在编译原理的模块。

编译原理-回溯法及其优化的思考相关推荐

  1. 图的m着色问题——回溯法及其优化(变量排序MRV, 值排序MCV, 前向检查ForwardChecking, 智能回溯, 边相容,K阶相容)python C++实现

    文章目录 图的m着色问题背景 背景知识 问题描述 回溯法的原理及其实现 回溯法基本思想 朴素回溯法解决图的m着色问题 回溯优化策略 回溯法优化--变量排序MRV 回溯法优化--值排序MCV 回溯法优化 ...

  2. 力扣638. 大礼包(回溯法+剪枝优化)

    第八十八天 --- 力扣638. 大礼包 题目一 思路:回溯法 代码 无剪枝的回溯 剪枝优化 Sum Up 题目一 力扣:力扣638. 大礼包 思路:回溯法 1.我们先不考虑礼包,直接去买东西,就是物 ...

  3. 深入浅出编译原理-3-词法分析器

    引言 编译器的工作的开始,就是读入源码(预编译先不考虑),然后,去除一些空字符,然后经过词素匹配,并和其属性(可选),组成一个的词法单元,多个词法单元,连接成词法单元序列.自此,此法分析器的工作就算完 ...

  4. 编译原理-16-语法分析概述

    Semantics1-概述 1. 属性文法(Attribute Grammar) 属性文法(Attribute Grammar):为上下文无关文法赋予语义 一对概念 两类属性定义 三种实现方式 四大应 ...

  5. 0027算法笔记——【回溯法】回溯法与装载问题

    1.回溯法 (1)描述:回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法.  (2)原 ...

  6. 【编译原理-实验-1】词法分析器最详细设计报告(c++版)

    词法分析器 一.实验目的 二.实验内容 1.根据状态转换图直接编程 2.编写DFA模拟程序(选做) 三.实验要求 1.能对任何S语言源程序进行分析(S语言定义见下面) 2.能检查并处理某些词法分析错误 ...

  7. 回溯法采用的搜索策略_数值优化|笔记整理(3)——线搜索中的步长选取方法,线性共轭梯度法...

    上一节笔记传送门: 学弱猹:数值优化|笔记整理(2)--线搜索:步长选取条件的收敛性​zhuanlan.zhihu.com ------------------------------------ 大 ...

  8. JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化

    Java编译原理 什么是字节码.机器码.本地代码? 字节码是指平常所了解的 .class 文件,Java 代码通过 javac 命令编译成字节码 机器码和本地代码都是指机器可以直接识别运行的代码,也就 ...

  9. 【编译原理】中间代码优化(一) 优化技术大观

    代码优化概述. 通过对程序进行等价变换,使得从变换后的程序出发,能够生成更加有效的目标代码,这种变换我们叫做优化. 优化其实可以在编译的各个阶段进行,但最主要的一类优化是在目标代码生成以前,对语法分析 ...

  10. 编译原理(六)自底向上分析之LR分析法

    自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...

最新文章

  1. 如何看待导师直接说你写的论文就是垃圾?
  2. ESXI上的vm虚拟机文件被锁定无法POWER ON的问题处理
  3. Xamarin XAML语言教程XAML文件结构与解析XAML
  4. LightOJ - 1098 A New Function
  5. 【转】ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证)...
  6. 点到直线的投影公式_2021高考复习资料:高中数学必备公式与知识点汇总
  7. 周鸿祎IOT发布会思考
  8. Facebook团队提供人工智能视频教程:机器学习入门教程指南
  9. 包含类别变量的中介模型检验方法
  10. 弄个linux系统计划任务让你感受一下删库跑路
  11. 两年3亿用户,淘特跑出中国电商“加速度”
  12. 使用 Excel 中的函数准确计算周岁年龄
  13. Unity-VR | AR相关(更新中)
  14. 管控内网安全 六项措施守护企业核心机密
  15. 迈阿密大学计算机学科排名,[转载]迈阿密大学排名及世界排名【研究生】
  16. 6 zzuliPTA家庭土地管理
  17. 搭建 WNMP 环境
  18. 双指针算法及模板应用
  19. 怎么做网线,网线水晶头接法和线序(图文详解)
  20. 简单梳理一下MySQL多版本并发控制原理

热门文章

  1. 如何使用PTPX预估芯片功耗
  2. linux下安装sg11,Linux安装SG11加密扩展组件教程
  3. java web编程从入门到实践 pdf_《Java Web编程从入门到实践》读书笔记(一)
  4. python修改系统时间_python修改操作系统时间的方法
  5. linux 极路由救砖,极路由三不死u-boot刷机方法
  6. [知乎]这可能是最全面的龙芯3A3000处理器评测
  7. python摄氏度转华氏度_如何用 python编写华氏摄氏度的相互转换?
  8. mysql 归档_MySQL数据归档的几种操作方法介绍
  9. 嘉兴学院c语言期末考试题库,液压与气压传动(嘉兴学院)知到APP答案
  10. 远程控制计算机显示为什么不能满屏,win7远程桌面不能全屏显示怎么办-处理win7远程桌面不能全屏显示的方法 - 河东软件园...