自动人形会梦见 NP 完全问题吗?
计算理论 (Theory of Computation) 当之无愧是计算机科学王冠上的明珠;考虑到我贫瘠的智商,以后估计不会朝 TCS 方向来走;但对这些优雅的理论有一个最基本的了解应当是 CS 学生的素养。
讽刺的是,你坑近二十年前就没有开设这门课了 [1],只得留待交换来上。老师是印度人,口音很重,我听完整节课才明白他口中的「GEO」其实是「zero」。
完整的笔记和错题集归档在博客园,这里就留下一点比较精华的东西吧!
This article is a self-administered course note.
It will NOT cover any exam or assignment related content.
DFA & NFA
DFA (Deterministic Finite Automaton)
确定有限状态自动机:有向图,一个开始状态 (starting
state),若干个接受状态 (accepting state)。边上带 label
用来标示转移。每个状态出度为 1 (出度为 0 的状态默认向
dead state 转移)。
NFA (Non-deterministic Finite Automaton) 非确定有限状态自动机:DFA
但每个状态出度可以大于 1。并且它的不确定性允许空转移
NFA 与 DFA 在 language recognition 意义上等价。
- DFA 显然是出度为 1 的 NFA。
- NFA 转 DFA 稍微麻烦点:因为
,我们直接令 ,把集合视为一个状态。重定义的转移 如下: 。这样,新 DFA 的状态数量要 exponentially more than 原 NFA。
什么是正则语言 (Regular Language) - 首先要知道什么是语言,语言就是满足某种规律的字符串集合 - 正则语言就是能被 DFA/NFA 识别的语言。
我们熟悉的正则表达式 (Regular Expression) 是一种可以描述正则语言规律的表达式,简单来说,就是用单个字符串 (表达式) 来表示字符串集合 (语言)。因此也可以这样说:正则语言是可以被正则表达式表示的语言。
符合直觉地,任意 DFA
可以转化为一个正则表达式;任意正则表达式可以转化为一个
怎样把 DFA 化为最简形式 (minimization of DFA),即,等价 DFA 中状态数最少的?
又是 DP。定义
where 。显然起始状态与接收状态是可被空串 分辨的。 otherwise。
开始 DP,已知使用长度为
Pumping Lemma for RL
Pumping Lemma (泵引理) 将会伴随整个计算理论课程,在这里我将首先介绍其 RL 版本。
若
- 对所有整数
,字符串
这里
这应该是所有泵引理中最容易证明的一个了:考虑某个能够识别
所有正则语言都满足泵引理,但也存在满足泵引理的非正则语言。因此泵引理常用来证否:若找到某个长度
PDA
PDA (Push Down Automata) 下推自动机是一种外置一个无限长的数据栈的有限状态自动机。转移条件不仅与当前读入的字符有关,也与栈顶元素有关。
转移
引入一种新的 notation,瞬时描述 (instantaneous
description)。它是一个三元组
上下文无关语言 (Context-Free Language) 是能够被 PDA 识别的语言。任意 CFL 都能被上下文无关语法 (Context-Free Grammar) 表达,或者,更准确地说,生成。
PDA - CFL - CFG 的关系与 DFA - RL - RE 的关系近似。
同样的,对任意 CFG 都能构造一个等价的空栈 PDA 来识别,对任意 PDA 都能构造一个等价的 CFG 生成相同的语言。证明见归档笔记,利用了 NPDA 的非确定性。
CFG
若同一个字符串存在两种派生方式 (存在两种形态有异的分析树),我们说该语法是歧义的 (ambiguous)。
Chomsky Normal Form
乔姆斯基范式 (Chomsky Normal Form) 是一种特殊的 CFG 范式,它规定该 CFG 的分析树是一颗二叉树。从生成规则上看,乔姆斯基范式要求每一种生成规则都满足以下形式:
( 均为变量 ) ( 为变量 , 为终止符 )
任意 CFG 都能转化为乔姆斯基范式。
第一步:消除所有空生成 (
- 去掉所有的
规则,并把 标记为空变量 (nullable variables)。 - 检查其他的规则,若规则
中, 包含空变量,则排列的 (permutation) 删去这些空变量。举个例子 ,删去后产生四个新规则 。
第二步:消除所有单元生成 (unit productions),即
经以上两步,
,此时 一定是单个终止符。 , 是终止符或者变量。
第三步:把所有生成规则转化为
- 若
是变量, - 若
是变量, - 以此类推,若
是变量, - 若某个
是终止符,令 ,其中
Pumping Lemma for CFL
来了!关于上下文无关语言 CFL 的泵引理。
若
- 对所有整数
,字符串
这一泵引理证明起来就有点复杂了。给定 CFG
考虑一个长度
考虑这一路径上的后

见上图,我们按照这种方式进行分割
- 条件一:
是 的深为 的子树,其叶子数量 ( ) 不会超过 - 条件二:
子树非空,一定能保证 - 条件三:既然有
且 ,先不断使用式一 ,再使用式二 。于是有 ;既然该字符串能被 产生,它同样属于原 CFL 。
Turing Machine
来到最强大的通用计算模型图灵机 (Turing Machine) 了。
无限长的纸带 (tape),读写头 (read-write head)
在该纸带上进行转移。转移方程如下:
读写头若到达任意接受状态 (accepting state),纸带上的字符串被视为接受。与 DFA/PDA 不同,图灵机不要求访问纸带上的所有字符 (前两个自动机均要求 consume 输入字符串的所有字符)。这一特性决定了图灵机可能在转移过程中陷入死循环,即,不停机 (halt)。
图灵机的瞬时描述 (instantaneous description):
图灵机存在许多变种:半无限带式图灵机 (semi-infinite tape TM),多带图灵机 (multi-tape TM),非确定性图灵机 (nondeterministic TM);但它们在语言识别意义上均与单带确定性图灵机等价 (区别在于时空复杂度)。
通用图灵机 (Universal TM) 是能够识别通用语言
(Universal Language)
这里要涉及一个概念,图灵机的编码 (coding scheme)。简单理解就是把图灵机编码成一个字符串;我们甚至可以通过遍历所有字符串来列举所有图灵机。
通用图灵机所做的只是 simulate
Decidability
几个概念。
- 递归可枚举语言 (Recursively Enumerable Language) 是能被图灵机识别的语言。
- 递归语言 (Recursive Language),或可判定语言 (Decidable Language),是能被图灵机识别,且在所有输入上都能停机的语言。
- 部分递归函数 (Partial Recursive Function)
— 很明显 TM 是一个函数,输入是 TM 处理前的纸带,输出是 TM 处理后的纸带 — 是能被图灵机计算,且该图灵机在 的定义域上停机,在 的定义域外不停机的函数。 - 递归函数 (Recursive Function)
— 是能被图灵机计算,且该图灵机在所有输入上都停机的函数。
显然,比起递归可枚举,递归是一个更强的约束。
一些有趣的结论:对角语言 (Diagonal Language)
规约 (Reduction):
- 如果
是递归的, 也是递归的 - 如果
是递归可枚举的, 也是 - 如果
是不可判定的, 也是 - 如果
不是递归可枚举的 (non-RE), 也不是
一开始我是把这个规约按照 COMP3357 中的那个规约理解的,后来发现两者不太一样。见后文关于 Karp Reduction 与 Cook Reduction 的讨论。
莱斯定理 (Rice's Theorem):递归可枚举语言的所有非平凡性质 (non-trivial property) 都是不可判定的。
- 非平凡性质
:至少有一个 RE 语言满足 ,也至少存在一个 RE 语言不满足 。 是不可判定的。
莱斯定理的详细证明见归档笔记,比较巧妙,可以将这个问题归约到空语言问题 (empty language problem) 上。
我们知道通用语言是递归可枚举的,但是它是可判定的吗?另一个在课上提到的例子是将波斯特对应问题 (Post's Correspondence Problem) 归约到通用语言。PCP 是著名的不可判定问题,因此我们能够确定通用语言递归可枚举,但不可判定。这个例子的证明也很巧妙,可见归档笔记,感觉我长了五个脑子也想不出来。
Halting Problem
著名的停机问题,这个必须得记录一下。
- INSTANCE:下标
- PROBLEM:第
个图灵机 是否在输入第 个字符串 后停机?
反证法。假设停机问题是可判定的,那么一定存在某个图灵机
构造一个悖论图灵机 (Paradoxical Turing Machine)
- 若
接受 ,即, 在 上停机,则令 陷入死循环 (不停机) - 若
拒绝 ,即, 在 上不停机,则令 停机
- 若
不在 上停机,说明 接受 ,即 在 上停机!悖论产生 - 若
在 上停机,说明 拒绝 ,即 不在 上停机!悖论产生
推出矛盾。假设为假:因此停机问题是不可判定问题。
P & NP
来正式认识一下 P 与 NP 问题。
P 问题:所有能够被一个确定性图灵机 (Deterministic TM) 在多项式时间内求解的问题。
NP 问题:所有能够被一个非确定性图灵机 (Nondeterministic TM) 在多项式时间内求解的问题。
显然有
命题:若
我们把这样的
因此,有人说 NP 问题代表的是一种可验证性
(verifiable)。找出解的过程也许是困难的,但验证解的过程是简单的。这也是
或者说,「真理的存在」一定代表着「真理是可被认识」的吗?
NPC
定义 Karp 规约 (Karp Reduction)
我们在加密学 COMP3357 中接触到的规约是 Cook 规约 (Cook Reduction);其特征是所调用的预言机 (Oracle) 是一个确定性多项式时间的机器,且可以被调用任意次数。而在本节课中提到的 Karp 规约仅能调用预言机一次。
NP 困难问题 (NP Hard)
NP 完全问题 (NP Complete)
,即
注意,NP hard 问题不一定是 NP 问题 (它可以比 NP 问题更困难,即,其答案都是难以验证的),但 NP complete 问题一定是 NP 问题。
由于所有的 NP 问题都能归约到 NPC 问题,若任意一个 NPC
问题在多项式时间上可解 (
著名的 NPC 问题:
- 可满足性问题 Satisfiability,e.g., 3-SAT
- 三维匹配问题 3D Matching
- 顶点覆盖问题 Vertex Cover (一个顶点覆盖所有邻接的顶点)
- 最大割问题 MAX-CUT
- K-问题 K-Clique (图中是否存在一个规模为
的团/完全子图) - 独立集问题 Independent Set (独立集中任意两个顶点都不相连)
- 哈密顿回路问题 Hamiltonian Circuit (每个顶点会且仅会被访问一次)
- 划分问题 Partition (正整数集合的等和分割)
- 集合覆盖问题 Set Cover
- 旅行商问题 Traveling Salesman Problem, TSP (权重和
的哈密顿回路)
3-SAT 归约到顶点覆盖问题。有
三个图论 NPC 问题 (Vertex Cover, Independent Set, K-Clique)
的规约关系:如果图
Reference
This article is a self-administered course note.
References in the article are from corresponding course materials if not specified.
Course info: CS3231. Professor: Sanjay Jain.
Course textbook: Introduction to Automata Theory, Languages and Computation (3rd Edition), Hopcraft, Motwani & Ullman, (2014), Pearson
Course website: https://www.comp.nus.edu.sg/~sanjay/cs3231.html
[1] 引自杨老师,摘录如下:「据考证,本科生课程 CSIS0293/COMP3293 Introduction to Theory of Computation 最后一次开设是在 Autumn 2005,研究生课程 CSIS9601/COMP9601 Theory of Computation and Algorithm Design 最后一次开设是在 Autumn 2016。」