可计算理论
有限自动机
DFA
DFA(Deterministic Finite Automaton)是一种有限状态自动机,其中每个状态对于每个输入符号都有且仅有一个转移。DFA可以用来识别正则语言。
定义: DFA由一个五元组组成,其中:
- 是状态集合
- 是输入符号集合
- 是转移函数,定义为
- 是初始状态
- 是接受状态集合
接受: 一个字符串被DFA接受,如果从初始状态出发,按照输入符号进行状态转移,最终停在一个接受状态。
语言: 语言是所有被自动机接受的字符串集合。我们称DFA“识别”语言,如果是DFA接受的字符串集合。
注:
- 空字符串也可以被DFA接受,取决于初始状态是否为接受状态。
- 空语言表示没有任何字符串被接受。注意,空字符串不属于空语言,因为空语言没有任何字符串。、
语言的交集: 两个语言的交集是同时被两个自动机接受的字符串集合。对于两个DFA 和,我们可以构造一个新的DFA ,使得。我们给出一个显式的构造:
- 状态集合:,其中和分别是和的状态集合。
- 输入符号集合:,与和相同。
- 转移函数:,其中和分别是和的转移函数。
- 初始状态:,其中和分别是和的初始状态。
- 接受状态集合:,其中和分别是和的接受状态集合。
状态示意图往往类似于一个网格,其中每个状态表示处于状态,处于状态。
正则语言: 正则语言是可以被DFA识别的语言。正则语言也可以通过正则表达式来描述。
正则语言的定义非常简单,但是判定一个语言是否为正则语言却是一个复杂的问题。我们可以使用泵引理(Pumping Lemma)来证明某些语言不是正则语言。我们 将在后续章节中介绍泵引理。
NFA
NFA(Nondeterministic Finite Automaton)是一种非确定性有限自动机,其中每个状态对于每个输入符号可以有多个转移。NFA也可以用来识别正则语言。
NFA与DFA的区别在于,NFA允许多个转移,而DFA每个状态对于每个输入符号只能有一个转移。尽管NFA看起来更强大,但实际上它们与DFA等价,即它们识别相同的语言。我们可以想象,NFA在无限的线程上并行地处理输入字符串,而DFA则在单线程上处理输入字符串(不准确)。
定理: 任何NFA等价于一个DFA,即对于每个NFA ,存在一个DFA使得。
这一点的证明略去。
我们下面陈述三个定理:
- 正则语言关于并运算闭合。
- 正则语言关于连接运算闭合。
- 正则语言关于星闭包运算闭合。
我们分别构造对应的DFA或者NFA来证明这些定理:
正则表达式
正则表达式是一种描述正则语言的工具。它使用特定的符号和规则来构建字符串集合。正则表达式可以转换为DFA或NFA,从而识别相同的语言。我们使用归纳定义:
定义:
基础:, , 是正则表达式。
递归:如果和是正则表达式,那么以下也是正则表达式:
下面证明所有的正则表达式都等价于为DFA:
定理: 对于每个正则表达式,存在一个DFA 使得。
证明:
我们通过对正则表达式的结构进行归纳证明。对于每个正则表达式,我们构造一个等价的NFA ,然后利用NFA与DFA的等价性得到DFA。
基础情况:
-
:构造NFA ,不接受任何字符串。
-
:构造NFA ,其中为空函数,只接受空字符串。
-
():构造NFA ,其中。
归纳步骤:
假设和分别对应NFA 和。
-
并运算 :
- 新建初始状态
- 添加转移到和的初始状态
- 接受状态为和接受状态的并集
-
连接运算 :
- 将的每个接受状态通过转移连接到的初始状态
- 的接受状态变为非接受状态
- 接受状态为的接受状态
-
星闭包 :
- 新建初始状态作为接受状态
- 添加转移到原NFA的初始状态
- 将原NFA的接受状态通过转移连接到原初始状态(形成循环)
- 保留原接受状态
通过上述构造,每个正则表达式都可以转换为等价的NFA,进而转换为DFA。证毕。
反向证明:对于每个DFA,我们首先构造其对应的GNFA。然后,对于任何一个状态,指向它的状态为,它指向下一个状态,其正则表达式分别为,,指向自己的表达式为,指向自己的正则表达式为。那么,指向自己的箭头为,指向的箭头就是,以此类推,我们就可以归纳消除到只有两个状态,这个箭头上的正则表达式就是DFA等价的正则表达式。
泵引理(Pumping Lemma)
泵引理是证明某个语言不是正则语言的重要工具。
泵引理(正则语言):设是一个正则语言,则存在一个泵长度,使得对于任何长度不小于的字符串,都可以被分解为,满足:
- 对于所有,有
直观理解:如果DFA有个状态,那么任何长度超过的字符串在DFA中运行时必然会重复经过某个状态。就是两次经过该状态之间的子串,可以”泵”(重复)任意次数。
证明思路:设DFA有个状态,考虑长度为的字符串。根据鸽巢原理,前个状态(包括初始状态)中必有重复,设(),则,,。
应用示例:证明不是正则语言。
证明:假设是正则语言,设泵长度为。考虑字符串。根据泵引理,,其中,因此只包含0。设(),则(0和1数量不等),矛盾!因此不是正则语言。
上下文无关语言
上下文无关语言(Context-Free Language, CFL)是比正则语言更丰富的语言类,可以用上下文无关文法(CFG)描述,也可以用下推自动机(PDA)识别。
上下文无关语法(CFG)
定义:上下文无关文法是一个四元组,其中:
- :变量(非终结符)的有限集合
- :终结符的有限集合(与不相交)
- :产生式规则集合,每条规则形如,其中,
- :起始变量
派生:如果存在产生式,则字符串可以一步派生为,记作。
语言:,即从起始变量可以派生出的所有终结符串的集合。
示例:
- 文法生成语言
- 文法生成平衡的括号串
歧义性:
- 如果存在字符串有多个不同的最左派生(或语法树),则称是歧义的
- 某些语言是固有歧义的(所有生成它的CFG都是歧义的)
Chomsky范式(CNF): 每个CFG都可以转换为等价的Chomsky范式,其中所有产生式形如:
- (两个变量)
- (单个终结符)
- (仅起始变量)
下推自动机(PDA)
PDA是在DFA基础上增加了一个栈(Stack)结构的自动机,可以识别上下文无关语言。
定义:PDA是一个六元组,其中:
- :状态集合
- :输入字母表
- :栈字母表
- :转移函数,
- :初始状态
- :接受状态集合
转移的含义:表示在状态,读入输入(可以是),栈顶为(可以是)时,可以转移到状态,并将栈顶替换为(弹出,压入的字符)。
接受方式:
- 终态接受:读完输入后停在接受状态
- 空栈接受:读完输入后栈为空
这两种接受方式是等价的。
示例:识别的PDA:
- 读0时压栈
- 读1时弹栈(检查栈顶是否为0)
- 接受当且仅当输入读完且栈为空
上下文无关语言与PDA等价性
定理:一个语言是上下文无关的,当且仅当存在某个PDA识别它。
CFG → PDA: 给定CFG ,构造PDA :
- 将压入栈
- 如果栈顶是变量,非确定性地选择一条产生式,将替换为
- 如果栈顶是终结符,读入输入并匹配
- 如果栈为空且输入读完,接受
PDA → CFG: 构造较复杂,核心思想是创建变量表示从状态到状态且栈底不变(即开始时栈为空,结束时栈也为空)的派生。
首先对PDA进行简化:
- 引入新的唯一接受状态;
- 确保接受时栈为空(通过添加状态逐个弹出栈中符号);
- 确保每次转移要么压入一个符号,要么弹出一个符号(不压不弹的转移可拆成两步)。
设简化后的PDA为,构造CFG :
- 变量集合:
- 起始变量:
- 产生式规则如下表所示:
| 情况 | 产生式 | 条件 |
|---|---|---|
| a) | 若包含,且包含,其中, | |
| b) | 对任意中间状态 | |
| c) | 对任意状态 |
直观解释:
- 情况a) 表示:从到且栈底不变的最短派生,可能先读入并在空栈上压入符号进入状态,然后从到保持栈底不变,最后从读入并弹出进入。
- 情况b) 表示:从到的派生可以拆分为两段,先经过某个中间状态。
- 情况c) 表示:不移动即可保持栈底不变,对应空串。
CFG的泵引理
泵引理(上下文无关语言):设是上下文无关语言,则存在一个泵长度,使得对于任何长度不小于的字符串,都可以被分解为,满足:
- 对于所有,有
直观理解:在足够长的派生中,某个变量会重复出现(在语法树的同一条路径上),形成可泵的部分。
应用示例:证明不是上下文无关的。
证明:假设是CFL,设泵长度为。考虑。根据泵引理,,其中,因此不能同时包含、、三种字符(因为最多跨越两种字符的边界)。 pumping后,三种字符的数量将不再相等,矛盾!
Ogden引理:泵引理的强化版本,可以选择某些位置作为”标记”,确保泵的部分包含标记。
上下文无关语言的封闭性
| 运算 | 是否封闭 | 说明 |
|---|---|---|
| 并 | ✓ | 易构造 |
| 连接 | ✓ | 易构造 |
| Kleene星 | ✓ | 易构造 |
| 交 | ✗ | 反例: |
| 补 | ✗ | 由不交补性得出 |
| 与正则语言的交 | ✓ | PDA × DFA构造 |
可判定性问题
| 问题 | 是否可判定 | 复杂度 |
|---|---|---|
| ? | ✓ | (CYK算法) |
| ? | ✓ | 检查可达变量 |
| ? | ✗ | 不可判定 |
| 是否歧义? | ✗ | 不可判定 |
| ? | ✗ | 不可判定 |
图灵机
图灵机(Turing Machine, TM)是计算理论中最强大的计算模型,由Alan Turing于1936年提出。它定义了”可计算”的直观概念。
定义
定义:图灵机是一个七元组,其中:
- :状态的有限集合
- :输入字母表(不包括空白符)
- :带字母表,且
- :转移函数,(确定性TM)
- :初始状态
- :接受状态
- :拒绝状态()
工作方式:
- 输入写在无限长的纸带上(两端无限或单向无限)
- 读写头初始位于输入最左端
- 根据当前状态和读到的符号,按照进行转移:改变状态、写入新符号、左移或右移
- 如果进入则接受,进入则拒绝
- 可能永不停机(loop)
格局(Configuration):描述TM某一时刻的完整状态,形如表示:
- 纸带内容为(其余为空白)
- 当前状态为
- 读写头指向的第一个符号
识别与判定:
- 识别(半判定):TM在输入上停机并接受
- 判定:TM在所有输入上都停机,且正确接受或拒绝
图灵机的变体
| 变体 | 描述 | 等价性 |
|---|---|---|
| 多带图灵机 | 有多个纸带和读写头 | 等价于单带TM |
| 非确定性TM(NTM) | 转移函数返回状态集合 | 等价于确定性TM |
| 枚举器 | 输出语言的枚举 | 等价于TM |
| 无限纸带 | 纸带双向无限 | 等价于单向无限 |
| 下推自动机+队列 | 栈替换为队列 | 等价于TM |
多带图灵机的单带模拟: 用单带存储多带内容,用特殊符号分隔,用额外的标记记录读写头位置。时间复杂度至多增加多项式倍。
丘奇-图灵论题(Church-Turing Thesis):
任何直观上可计算的函数都可以被图灵机计算。
这不是一个数学定理,而是一个关于”计算”本质的论题,被广泛接受。
停机问题
停机问题是计算机科学中最著名的不可判定问题。
停机问题:给定图灵机和输入,判定是否在输入上停机。
定理:停机问题是不可判定的。
证明(对角化法): 假设存在判定停机问题的TM ,构造TM :
- 输入为图灵机的描述
- 模拟在输入上的运行
- 如果接受(在自身描述上停机),则进入无限循环
- 如果拒绝(在自身描述上不停机),则接受
考虑在输入上的行为:
- 如果停机,则接受,则不停机,矛盾!
- 如果不停机,则拒绝,则停机,矛盾!
因此不存在,停机问题不可判定。
可归约性与更多不可判定问题
可归约性:语言可归约到语言(),如果存在可计算函数,使得。
性质:如果且可判定,则可判定。逆否命题:如果且不可判定,则不可判定。
其他不可判定问题:
| 问题 | 描述 |
|---|---|
| 停机问题 | |
| Post对应问题(PCP) | 字符串匹配问题 |
| 群的字问题 | 判定群论中的等式 |
Rice定理:任何关于图灵机识别语言的非平凡性质都是不可判定的。
形式化:设是关于语言的性质,是非平凡的(存在TM满足,存在TM不满足),则是不可判定的。
可计算性层次
| 类别 | 定义 | 示例 |
|---|---|---|
| 递归可枚举(r.e.) | 被某个TM识别 | 、停机问题 |
| 递归(可判定) | 被某个TM判定 | 正则语言、上下文无关语言 |
| co-r.e. | 补集是r.e. | 的补集 |
关系:可判定 = r.e. ∩ co-r.e.
复杂性理论
复杂性理论研究计算问题的资源需求(主要是时间和空间),将问题按照难度分类。
时间复杂度
时间复杂性类:
:由时间的确定性图灵机判定的语言类。
主要复杂性类:
| 类 | 定义 | 描述 |
|---|---|---|
| 多项式时间可判定 | ||
| 指数时间可判定 | ||
| 线性指数时间 |
的意义:
- 被认为是”易处理”(tractable)的问题类
- 对模型变化鲁棒(多带、随机访问机等多项式相关)
类
类包含所有可以被确定性图灵机在多项式时间内判定的语言。
中的问题:
- 路径问题(PATH):图中有无到的路径(BFS/DFS)
- 素数判定(PRIMES):2002年被证明属于(AKS算法)
- 线性规划
- 上下文无关语言的成员判定
编码的影响: 问题的编码方式可能影响复杂性。通常假设合理编码(如数字用二进制而非一元表示)。
非确定性时间
:由时间的非确定性图灵机判定的语言类。
= :非确定性多项式时间可判定的语言类。
的等价定义:
- 可以被多项式时间验证的解的语言
- 存在多项式时间验证器,使得当且仅当存在证书,,使得接受
中的问题:
| 问题 | 描述 | 证书 |
|---|---|---|
| SAT | 布尔公式可满足 | 满足赋值 |
| CLIQUE | 图中是否存在团 | 团的顶点集 |
| VERTEX-COVER | 是否存在大小为的顶点覆盖 | 覆盖顶点集 |
| HAMILTONIAN-PATH | 是否存在哈密顿路径 | 路径顶点序列 |
| SUBSET-SUM | 子集和等于目标值 | 子集本身 |
| TSP | 旅行商问题(判定版本) | 具体路径 |
| GRAPH-COLORING | 图是否-可着色 | 着色方案 |
NP完全问题与Cook-Levin定理
多项式时间归约:,如果存在多项式时间可计算函数,使得。
NP难(NP-hard):语言是NP难的,如果对于所有,有。
NP完全(NP-complete):语言是NP完全的,如果:
- 是NP难的
Cook-Levin定理(1971):SAT是NP完全的。
证明思路:
- 显然(给定赋值可多项式时间验证)
- 证明SAT是NP难的:对于任意语言和输入,构造布尔公式,使得可满足当且仅当存在证书使
- 构造模拟NTM计算的布尔电路,编码为CNF公式
经典NP完全问题归约链:
NP完全问题的处理策略
面对NP完全问题,常用策略:
-
近似算法:在多项式时间内找到接近最优的解
- 顶点覆盖:2-近似算法
- TSP(满足三角不等式):2-近似(MST-based),1.5-近似(Christofides)
-
启发式算法:没有理论保证但实际效果好
- 模拟退火
- 遗传算法
- 禁忌搜索
-
参数化算法:将复杂度与问题参数关联
- 顶点覆盖:算法
-
固定参数可追踪(FPT):时间复杂度为
-
随机算法:使用随机化获得好的期望性能
-
处理特殊情况:某些限制条件下问题可能变得易解
- 2SAT(每个子句最多2个文字)属于
- 平面图上的3COLORING属于
复杂性类的关系
基本包含关系:
开放问题:
- :计算机科学最重要的未解决问题
- 大多数人相信
- 证明难度:已知某些证明技术(相对化、自然证明)无法解决此问题
其他重要复杂性类:
| 类 | 定义 | 描述 |
|---|---|---|
| 补集在中 | 全称验证 | |
| 多项式空间 | 空间而非时间限制 | |
| 非确定性多项式空间 | 等于(Savitch定理) | |
| 对数空间 | 高度受限 | |
| 非确定性对数空间 | 路径问题完备 | |
| 有界错误概率多项式时间 | 随机算法 | |
| 单侧错误随机多项式时间 | 无假阳性 |
NP问题举例
以下是一些著名的NP完全问题:
1. 布尔可满足性问题(SAT)
- 输入:布尔公式
- 问题:是否存在赋值使为真?
- 3SAT限制:每个子句恰好3个文字,仍是NP完全
2. 团问题(CLIQUE)
- 输入:图,整数
- 问题:是否包含大小为的完全子图?
- 补问题:独立集问题(INDEPENDENT SET)
3. 顶点覆盖(VERTEX-COVER)
- 输入:图,整数
- 问题:是否存在大小为的顶点覆盖(每条边至少一个端点在覆盖中)?
- 关系:顶点覆盖的补是独立集
4. 哈密顿路径/回路
- HAMILTONIAN-PATH:图中是否存在经过每个顶点恰好一次的路径?
- HAMILTONIAN-CYCLE:是否存在哈密顿回路?
- 即使限制在平面图中仍是NP完全
5. 旅行商问题(TSP)
- 判定版本:给定距离矩阵和界限,是否存在长度的回路访问所有城市?
- 优化版本:找最短回路(NP难)
- 欧几里得TSP也是NP完全
6. 子集和(SUBSET-SUM)
- 输入:整数集合,目标值
- 问题:是否存在子集和等于?
- 与背包问题密切相关
7. 划分问题(PARTITION)
- 输入:正整数集合
- 问题:是否可将划分为两个和相等的子集?
8. 图着色(GRAPH-COLORING)
- 输入:图,整数
- 问题:是否-可着色(相邻顶点不同色)?
- 3COLORING是NP完全,2COLORING属于
9. 装箱问题(BIN-PACKING)
- 输入:物品大小,箱子容量,箱子数量
- 问题:是否可用个箱子装下所有物品?
10. 集合覆盖(SET-COVER)
- 输入:集合族,全集,整数
- 问题:是否存在个集合覆盖?
- 对数近似比(贪心算法)
这些问题的NP完全性意味着:
- 不太可能有多项式时间算法
- 一个问题的突破意味着所有NP问题的突破(如果找到多项式算法)
- 实际应用中需要借助近似算法、启发式或专门求解器
Comments