首页 / 资讯中心 / 文章详情

计算理论期末复习:自动机、可判定性与复杂度分层

计算理论期末复习:自动机、可判定性与复杂度分层 ★ FEATURED ARTICLE
简介《计算理论知识点.docx》面向备战哈尔滨工程大学计算理论期末的学生也适合需要快速梳理计算理论基础概念的读者核心解决知识点分散、复习抓不住重点的问题。压缩包仅含1个docx文件约18KB篇幅集中便于打印或导入平板背诵。内容围绕自动机理论、图灵机、语言理论、计算复杂度等主线展开涵盖正则语言封闭性与DFA/NFA等价、上下文无关语言与下推自动机、图灵可识别与可判定、判定器、丘奇-图灵论题、停机问题、映射可归约性、可计算函数、线性有穷自动机以及P类与NP类等高频考点以条目化表述串联定义、判定条件与典型结论。目前已有551人学习适合考前对照课堂笔记查漏补缺也可作为章节复习时快速回忆概念、梳理证明思路与背诵典型判断题的清单并据此安排冲刺阶段的背诵顺序。1. 计算理论到底在讲什么从“机器能不能算”说起计算理论知识点听起来像一堆必须背下来的定理其实它只追问三件事一台机器能算什么、不能算什么、算得有多快。期末周把计算理论期末范围背下来确实能应付不少填空但定义一旦混在一起做题就容易翻车。打个比方自动机像地铁闸机只认几种固定票型更强的计算模型像一台会写草稿的机器能边算边改复杂度理论则像给题目贴“好算”“难算”的标签。搞懂这套分层你看到正则语言、上下文无关语言、可判定语言、P 和 NP 时就不会把它们当成同一层的东西硬背。这份整理的价值是把散落的定义按“机器能力”串成一条线。2. 有穷自动机与正则语言为什么“背下来”之前要先看懂骨架有穷自动机是计算理论里最轻量的一类机器。它没有草稿纸也没有栈只有一组固定状态和一张转移表。你可以把它想成老式转盘电话的计费器每读入一个字符它就按事先画好的线路跳到下一个状态读完了看自己停在哪接受就亮绿灯拒绝就亮红灯。它的“记性”只有当前状态那么多不能回头修改已经读过的内容也不能把读过的串压进栈里。正则语言就是这类机器能够识别的语言集合。2.1 有穷自动机到底在做什么确定型有穷自动机通常写成五元组状态集合、输入字母表、转移函数、起始状态、接受状态集合。转移函数的形式是“当前状态 当前字符 → 下一个状态”。比如要识别“所有以 01 结尾的二进制串”可以设计三个主要状态还没看到可能结尾、刚看到一个 0、刚看到 01。每读一位就按规则跳转最后停在“刚看到 01”就接受。这个例子很小却把自动机的本质说清了它不保存整条输入只保存“到目前为止最关键的判断”。非确定型有穷自动机多了一点“猜”的能力。同一个状态读同一个字符它可以跳到多个下一状态它还允许不读字符就沿着空串转移。直观地说确定型机器像一条路走到黑非确定型机器像同时派出很多小分身去试不同路线只要有一个分身走到接受状态整台机器就接受。这里最容易被误解的地方是非确定型不是“更高级的玄学”它和确定型在识别能力上等价。每一台非确定型有穷自动机都能转成一台确定型有穷自动机常用办法是子集构造把“当前可能处在的状态集合”当成新机器的一个状态。状态数可能膨胀但能力没有变。提示子集构造解决的是“能不能等价转换”不是“状态数会不会变少”。很多初学者看到状态爆炸就以为转换失败其实只是确定型机器把非确定型的并行分支摊开写了。正则表达式是描述正则语言的另一种写法。并、连接、星号这三种运算反复组合就能写出(0|1)*01这样的模式。它和自动机是同一层能力的两种表达一个有穷自动机能识别的语言一定可以用正则表达式描述一个正则表达式描述的语言也一定可以造出一台有穷自动机来识别。期末复习时把“自动机—正则表达式—正则语言”三者绑在一起记比单独背三条定义更稳。2.2 正则语言为什么对并、连接、星号封闭“封闭”这个词听起来抽象换成大白话就是拿正则语言做某种运算结果仍然是正则语言。并运算像把两个闸机的入口并在一起只要串能过其中一个入口就算通过连接像把两段流水线首尾相接前一段的输出直接送进后一段星号像把一段流水线反复循环零次或多次。这三种操作都不会要求机器记住无限长的历史所以造出来的新机器仍然可以用有穷状态控制。为什么这件事值得讲因为很多证明题不是让你从零造机器而是让你用已知封闭性“拼”出结论。比如已知 A 和 B 是正则语言要证明它们的并是正则语言不必重新画转移图只要引用并运算封闭即可。连接和星号同理。反过来如果题目给你一个看起来很像正则的语言你却怎么画自动机都画不出来就要怀疑它是否真的正则。经典例子是“0 的个数和 1 的个数相等”的串集合它不是正则语言有穷状态记不住已经读了多少个 0也没法在读完后再回头配对。这个例子常被用来区分“看起来有规律”和“真正正则可识别”。需要留意封闭性说的是“正则语言在这几种运算下仍然正则”不是“所有语言做这些运算都正则”。把正则语言和任意语言并在一起结果未必正则。考试里常见的坑是题目给了一个正则语言和一个陌生语言问并运算后是否正则不能直接套封闭性要先看另一个语言是不是正则。2.3 确定型与非确定型等价不等于一样确定型和非确定型的等价是计算理论里最容易被背成口号的一条。等价的意思是“识别能力相同”不是“运行过程相同”。确定型机器在每个时刻只有一个下一步非确定型机器可以同时有多个下一步确定型机器读完整条串只有一条计算路径非确定型机器可能有一棵树状的分支。可在“是否存在一条接受路径”这个判断上两者能识别同一批语言。这个区别在后面的复杂度理论里会再次出现。非确定型多项式时间机器可以“猜”一个解再验证确定型机器则要老老实实搜索。P 和 NP 的差别根源就在这里。第 2 章先把“非确定型是一种描述方式不是一台现实中同时分裂的机器”这件事说清后面看到 NP 时才不会把“非确定型”当成“无限快”。还有一个常见误解非确定型有穷自动机等价于确定型有穷自动机不代表非确定型图灵机也一定能在同样时间内转成确定型。前者是“能力等价”后者涉及“时间代价”。有穷自动机的状态数可以膨胀但总归有限一般计算模型的时间转换可能带来指数级开销。把“等价”与“同效率”分开是学计算理论时很值钱的一个习惯。3. 抽象计算机与可判定性从“能识别”到“能停下来”有穷自动机没有草稿纸所以它的能力被卡得很死。给它一条可以读写、可以左右移动的纸带再给它一个有限状态控制器就得到了更一般的抽象计算机通常记作 TM 模型。它仍然是“机器”但能边读边写、能回头修改表达能力一下子强了很多。正则语言、上下文无关语言、可判定语言、可识别语言都是围绕“这台机器能做什么、会不会停下来”展开的。3.1 格局、读写头与计算历史TM 模型在某一瞬间长什么样用“格局”来描述当前状态是什么、纸带上写着什么、读写头停在哪个位置。把格局按时间顺序排成一串就是计算历史。起始格局是机器刚把输入放上纸带、读写头停在最左端时的样子接受格局是机器进入接受状态拒绝格局是机器进入拒绝状态。确定型机器在给定输入上最多只有一条计算历史非确定型机器可能有多条对应不同分支。这里有个容易忽略的点计算历史一定是有限序列。如果机器在某个输入上永远不停机那它既没有接受历史也没有拒绝历史。很多人把“没有接受”直接等同于“拒绝”这在可识别语言里是不成立的。机器可能一直在循环既没接受也没拒绝。考试里判断一个语言是否可判定关键不是“能不能找到接受路径”而是“机器是否对所有输入都停机并给出接受或拒绝”。还有一个细节循环不等于“重复同样的步骤”。机器可能一直在写新内容、一直往右走看起来每次都不一样但就是不停机。判定器之所以被单独拿出来是因为它排除了这种“可能永远等不到答案”的情况。判定器对所有输入都停机所以它总能明确告诉你“是”或“不是”。3.2 TM 可识别与 TM 可判定差在哪TM 可识别的语言通俗地说是“只要串真的属于这个语言机器迟早会举手接受”的语言。对于不属于这个语言的串机器可能拒绝也可能一直循环。它像一位只保证“对的时候会回消息”的客服你问对了他一定回你问错了他可能不回也可能直接挂断。TM 可判定的语言更强机器对所有输入都停机属于就接受不属于就拒绝像一位无论你问什么都给明确答复的客服。这个差别可以用补集来测。一个语言可判定当且仅当它既是 TM 可识别的也是补 TM 可识别的。直观理解如果原语言有一个识别器补语言也有一个识别器那么面对任意输入可以同时跑这两台机器只要其中一台接受就能判断输入属于哪一边。因为两个语言互补总有一台会接受所以不会永远等下去。这个结论在证明题里很好用要证某个语言可判定可以拆成“它可识别”和“它的补可识别”两半。需要分清“可识别”和“可判定”的包含关系每一个可判定语言都是可识别的但反过来不成立。最典型的例子是“TM 是否接受某输入”这个语言它是可识别的因为只要模拟机器运行一旦接受就举手但它不可判定因为模拟可能永远不停。它的补语言甚至不可识别。这个三角关系是后面归约证明的支点。3.3 判定器为什么是更“好用”的机器判定器就是“对所有输入都停机”的 TM。它不一定快但它一定给答案。计算理论里很多结论都偏爱判定器因为“永远不停”的机器没法当作可靠的判断程序。你说一个语言可判定等于说存在一台机器面对任何输入都能在有限步内给出接受或拒绝你说一个语言可识别只等于说存在一台机器面对属于它的输入最终会接受面对不属于它的输入可能永远不说话。多带 TM 与单带 TM 等价、非确定型 TM 与确定型 TM 等价这两条结论说明“多加几条纸带”或“多开几个分支”不会改变可计算性的边界。它们改变的是描述方便程度和运行代价不是“能不能算”。这也解释了为什么理论证明里可以放心地用多带机器描述算法最后再说明它等价于单带机器。可计算性论题把“算法”的直观概念和 TM 可计算性对应起来凡是能写成明确步骤、有限步内完成的计算都可以用 TM 模型描述。这个论题不是数学定理而是一个被广泛接受的约定。它让“可计算”“不可计算”有了可讨论的边界。描述 TM 时还有三种层次形式化描述会写清状态和转移函数实现描述用日常语言说清纸带怎么动高水平描述只讲算法思路不纠结纸带管理。做题时看清题目要哪一种能省很多力气。可判定与不可判定的清单也要成组记。确定型有穷自动机是否接受某串、非确定型有穷自动机是否接受某串、正则表达式是否产生某串、上下文无关文法是否产生某串这些通常是可判定的TM 是否接受某输入、TM 是否停机、TM 是否不接受任何串、两个 TM 是否接受相同语言、PCP 等则不可判定。不要孤立背名字要按“机器能力越强问题越容易不可判定”这条线去理解。4. 归约与不可判定性为什么有些问题注定没有通用答案归约是计算理论里最像“翻译”的工具。你有一个不会解的问题 A又有一个已经知道难的问题 B如果能写一个可计算函数把 A 的每个实例翻译成 B 的实例并且保证“原实例在 A 里”当且仅当“翻译后的实例在 B 里”那么解 B 的办法就能拿来解 A。反过来如果 A 已知不可判定而 A 能归约到 B那 B 也不可判定。这个“传染”方向是整章的核心。4.1 映射归约把 A 的实例翻译成 B 的实例映射归约记作 A ≤m B读作“A 映射可归约到 B”。它要求存在一个可计算函数 f对每个输入串 w都有 w 属于 A 当且仅当 f(w) 属于 B。f 必须是一台在所有输入上都停机的 TM 能算出来的函数不能是“理论上存在但算不出来”的函数。这个条件保证了翻译过程本身不会成为新的不可判定来源。归约的方向很容易记反。A ≤m B 的意思是“A 不比 B 难太多”把 A 的问题翻译成 B 的问题用 B 的解法解 A。所以如果 A 是不可判定的B 一定也不可判定如果 B 是可识别的A 也一定可识别。注意后一句的方向B 可识别则 A 可识别不是 A 可识别推出 B 可识别。很多证明题翻车就翻在这个箭头上。举个通俗的类比你想知道一份外文说明书里有没有“警告”这个词但你看不懂外文你手里有一台能查中文说明书里有没有“警告”的机器。于是你写一个翻译程序把外文说明书逐句翻成中文再交给那台机器。翻译程序就是归约函数。只要翻译不改变“有没有警告”这个事实你就能用中文检查器解决外文检查问题。归约的方向是“把待解问题翻译成已知问题”不是反过来。4.2 停机问题与不可判定性的传染停机问题问的是给定一台 TM 和一段输入这台机器最终会不会停下来。它不可判定。直观理由不是“我们不够聪明”而是“如果存在一个总能判断停机的程序就能构造出一台机器专门做与判断结果相反的事从而制造矛盾”。这个对角线式的论证不需要真的写出一台永不停机的机器它只说明“假设存在判定器”会推出逻辑矛盾。一旦停机问题不可判定很多问题就可以通过归约被“传染”。比如“TM 是否接受某输入”不可判定假设它有判定器就能用它判断停机但停机问题不可判定所以假设不成立。再比如“两个 TM 是否接受相同语言”不仅不可判定而且它和它的补都不是可识别的。这个结论比“不可判定”更强你连“靠一边举手来逼近答案”都做不到。这里要区分“不可判定”和“不可识别”。不可判定是说没有一台对所有输入都停机的机器能给出正确接受/拒绝不可识别是说连“属于时最终接受”的机器都不存在。一个语言可以不可判定但仍可识别比如“TM 是否接受某输入”也可以既不可判定又不可识别比如它的补语言。考试里看到“不可判定”不要立刻写“不可识别”先看补集那一半。4.3 可识别、补可识别与可判定的三角关系把三个概念放在一起看最清楚可判定 可识别 补可识别。可识别 存在一台机器对属于语言的串最终接受补可识别 存在一台机器对不属于语言的串最终接受可判定 存在一台机器对所有输入都停机并且接受属于的、拒绝不属于的。三者不是并列关系而是层层加强。很多不可判定性证明的套路是先证明某个语言可识别但不可判定再用归约把“不可判定”传给下一个语言。比如“TM 是否接受某输入”可识别但不可判定“TM 是否不接受任何串”不可判定而且它的补是可识别的两个 TM 是否接受相同语言则两边都不可识别。把这些典型例子按“可识别/补可识别/可判定”三列摆开比背一长串名字更不容易混。多项式时间归约是同一套思路的效率版f 不仅要可计算还要在多项式时间内可计算记作 A ≤p B。如果 A ≤p B 且 B 在 P 里那么 A 也在 P 里如果 A 是 NP 完全的B 在 NP 里那么 B 也是 NP 完全的。SAT 完全性定理说SAT 属于 P 当且仅当 P NP。3SAT 可以多项式时间归约到 CLIQUECLIQUE 又可以归约到独立集、顶点覆盖等。归约链不是越归约越简单而是把已知难度搬过去。空间复杂度这边也有类似的包含链L ⊆ NL ⊆ P ⊆ NP ⊆ PSPACE NPSPACE。空间压缩定理说明非确定型空间可以转成确定型空间代价是平方级所以 PSPACE 和 NPSPACE 在多项式空间这一层相等。TQBF、FORMULA-GAME、GG 是 PSPACE 完全的PATH 是 NL 完全的。若有一个 NL 完全语言属于 L则 L NL。这些结论不是让你背缩写而是让你知道“给一个问题找上界和下界”时该往哪一层放。5. 常见易混概念正则、上下文无关、可判定、P/NP 到底差在哪学到后期最容易出现的不是“完全不会”而是“每个词都眼熟放在一起就串味”。正则语言和上下文无关语言都叫语言类可识别和可判定都带“识别”P 和 NP 都带“多项式”归约方向一颠倒结论就反。下面四条是复习时最容易踩坑的地方按“易混点—为什么混—怎么区分”拆开看。5.1 正则语言与上下文无关语言一个有栈一个没栈易混点两者都能用自动机识别也都能用文法描述名字里都带“语言”很多人会把“正则”当成“上下文无关”的别名或者以为上下文无关语言只是正则语言的另一种写法。为什么混教材里经常把有穷自动机、正则表达式、正则文法放在一起讲紧接着又拿下推自动机、上下文无关文法、CNF 范式放在下一章。前后都出现“状态”“转移”“产生式”如果只背结论很容易把“正则语言在并、连接、星号下封闭”和“上下文无关语言在并、连接、星号下封闭”混成一条。怎么区分看机器有没有栈。有穷自动机没有栈只能记住当前状态所以它识别不了“0 的个数和 1 的个数相等”这种需要计数的语言下推自动机有一个后进先出的栈能处理括号匹配、嵌套结构所以0^n1^n是上下文无关语言但不是正则语言。所有正则语言都是上下文无关语言反过来不成立。判断时先问“需不需要无限计数或嵌套配对”需要就往上下文无关及以上找只涉及固定模式、有限状态能搞定的优先想正则。5.2 可识别与可判定一个保证“是”一个保证“停”易混点两个词都像“机器能认出来”做题时容易把“可识别”直接当成“可判定”或者把“不可判定”写成“不可识别”。为什么混可判定语言一定是可识别的所以很多例子两边都成立而“识别”这个词在日常语言里本来就带“能判断”的意思。加上“判定器”和“识别器”只差一个字背定义时很容易滑过去。怎么区分可识别只保证“属于这个语言的串机器最终接受”不属于的串机器可能拒绝也可能永远循环。可判定要求“对所有输入都停机”属于就接受不属于就拒绝。用补集记可判定 可识别 补可识别。典型例子是“TM 是否接受某输入”它可识别但不可判定它的补不可识别。看到“不可判定”先别急着写“不可识别”先看补集能不能识别。5.3 P、NP、PSPACE 与完全性快速判定和快速验证不是一回事易混点P 和 NP 都带“多项式时间”很多人把 NP 理解成“不能在多项式时间内解决”或者把“NP 完全”当成“所有问题里最难的”。为什么混教材常用“非确定型多项式时间”定义 NP而日常语境里“非确定”听起来像“不确定能不能算”。再加上 SAT、CLIQUE、HAMPATH 这些例子反复出现容易把“NP 完全”当成一个万能难度标签。怎么区分P 是“成员可以快速判定”的语言类NP 是“成员可以快速验证”的语言类。验证的意思是如果别人给你一个候选解你能在多项式时间内检查它对不对。P NP 是否成立至今未知SAT 属于 P 当且仅当 P NP。NP 完全语言是 NP 里“最难”的一批它本身在 NP 里并且所有 NP 问题都能多项式时间归约到它。PSPACE 比 NP 更宽TQBF 等是 PSPACE 完全的。判断一个问题时先问“我要判定还是验证”“我的上界在哪一层”不要拿“NP 完全”当“绝对写不出程序”的同义词。5.4 归约方向与“传染”方向别把箭头写反易混点A ≤m B 到底表示 A 难还是 B 难为什么有时用“A 不可判定”推“B 不可判定”有时又用“B 可识别”推“A 可识别”为什么混归约的箭头指向“被用来解题的问题”但结论的传染方向有时候相反。再加上映射归约、多项式时间归约、对数空间归约符号长得像复习时容易只记结论不记前提。怎么区分把 A ≤m B 读成“A 可以翻译成 B”。翻译的方向是从 A 到 B解题时用 B 的解法解 A。所以如果 A 不可判定B 也不可能可判定否则 A 就能借 B 判定如果 B 可识别A 也可识别因为先翻译再交给 B 的识别器。多项式时间归约同理A ≤p B 且 B ∈ P则 A ∈ P。写证明时先写清“我要把哪个问题翻成哪个问题”再写“假设后者有判定器”方向就不容易反。6. 什么时候用这套知识从期末复习到工程判断这套知识最直接的用处是期末复习但它的价值不止于做题。遇到一个陌生问题先判断它落在哪一层只需要固定模式匹配正则表达式或有穷自动机就够涉及嵌套结构、表达式语法、协议字段嵌套上下文无关文法和下推自动机更合适涉及通用计算、程序行为分析就要想到 TM 模型和可判定性边界涉及算法可行性再往 P、NP、PSPACE 这些复杂度类里放。这个“先分层、再选工具”的习惯比背一百条结论更能减少无效努力。场景适合先想到的概念别急着做什么输入格式校验、日志字段匹配正则语言、正则表达式、有穷自动机一上来就写复杂文法表达式解析、括号嵌套、配置文件结构上下文无关文法、下推自动机用正则硬扛无限嵌套程序行为分析、解释器边界判断TM 模型、可判定性、可识别性把“不可判定”当成“完全不能写代码”算法题难度评估P、NP、NP 完全、多项式归约看到 NP 完全就放弃所有近似或特例也有不该用的时候。给一个简单的表单校验上整套下推自动机属于过度形式化把“某个问题不可判定”直接理解成“任何实际程序都做不了”属于把理论边界当工程借口把“NP 完全”当成“所有输入都算不动”忽略了实际数据规模、启发式搜索和近似算法。理论给的是边界和分层不是替代工程判断的万能答案。我期末复习时就翻过一次车把“可识别”和“可判定”背成一句顺口溜做题时漏了补集条件把“可识别但不可判定”的例子写成了“可判定”整道大题的方向都歪了。从那以后我每次看到语言类问题都强制走一遍“机器停不停、补集认不认、归约箭头朝哪边”这三步再动笔写结论。这份计算理论知识点整理适合放在手边当索引遇到一个定义先翻到对应条目再顺着“机器能力”往下读完整的资料已经放在资料页拿走后按自己的薄弱点过一遍就好。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站