- 下列每对问题, 一个是可用多项式时间算法解决的, 一个是NP完全问题
- 最短和最长简单路径
- 欧拉回路和哈密顿圈
- 2-CNF可满足性问题和3-CNF可满足性问题
- 证书: 如哈密顿圈问题中的|V|个顶点序列, 3-CNF可满足性问题中的一组变量的赋值
- 可被证明: 已知一个问题的证书, 可以证明此问题在该输入规模下能在多项式时间内解决
- 所有P类问题同时也是NP问题, P类问题不用任何证书就可以在多项式时间内解决
- 判定问题和最优化问题
- 归约:
- 某一特定问题的输入为该问题的实例.
- 对于一个判定问题A, 假设有另一个不同的判定问题B, 我们知道如果在多项式时间内解决
- 有一个过程, 可将A的任意实例$\alpha$转化为B的具有以下特征的某个实例$\beta$:
- 转换操作需要多项式时间
- 两个实例的解是相同的, $\alpha$的解为”是”当且仅当$\beta$的解为”是”
- 称这一过程为多项式时间归约算法
- 一种多项式时间解决A的方法:
- 给定问题A的实例$\alpha$, 利用多项式时间归约算法, 将他转化为问题B的一个实例$\beta$
- 在实例$\beta$上, 运行B的多项式时间判定算法
- 将$\beta$的解作为$\alpha$的解
- 相反的, 利用多项式时间归约, 说明一个问题是NP完全的:
- 假设有一个判定问题A, 已知它不可能存在多项式时间算法
- 假设有一个多项式时间的归约, 将A的一个实例转化为一个B的实例
- 如果B存在多项式时间算法, 那么A也存在多项式时间算法, 矛盾
- 类似的, 可以在问题A是NP完全的假设下, 证明问题B是NP完全的
- 第一个NP完全问题
- 电路可满足性问题
多项式时间
- 抽象问题Q: 在问题实例集合I和问题解集合S上的一个二元关系
- 编码: 抽象对象集合S的编码是从S到二进制串集合的映射e
- 具体问题: 以二进制串集合为实例集的问题
- 多项式时间可解: 对于常数k, 存在一个能在$O(n^k)$时间内求解出某具体问题的算法
- 复杂类P: 在多项式时间内可解的具体判定问题的集合
- 编码会影响算法运行时间
- 对于某个问题的实例集I, 如果存在两个多项式时间可计算的函数$f_{12}$和$f_{21}$满足对于任意$i\in I$, 有$f_{12}(e_1(i)) = e_2(i)$, 且$f_{21}(e_2(i)) = e_1(i)$, 那么这两种编码$e_1$和$e_2$是多项式相关的.
- Q是顶一个在一个实例集I上的一个抽象判定问题, $e_1$和$e_2$是I上多项式相关的编码, 则$e_1(Q)\in P$当且仅当$e_2(Q)\in P$
- 形式语言体系:
- 字母表, 语言, 交, 并, 补, 连结, …
- 闭包$L^* = \{\epsilon \}\cup L \cup L^2 \cup L^3 \cup \cdots$, 其中$L^k$是L与其自身进行k次连结运算后得到的语言
- 复杂类P的另一种定义: $P =\{L \subseteq \{0, 1\}^*: 存在一个算法A, 可以在多项式时间内判定L\}$
- $P = \{L: L被一个多项式时间算法所接受 \}$
多项式时间的验证
- 验证算法:
- 含两个自变量的算法A, 其中一个自变量是普通输入串x, 另一个是称为证书的二进制串y.
- 如果存在一个证书y满足$A(x, y)= 1$, 则该含两个自变量的算法A验证了输入串x.
- 由一个验证算法A锁验证的语言是: $L=\{x\in \{0, 1\}^: 存在y\in \{0,1\}^, 满足A(x, y)=1\}$
- 如果对任意串$x\in L$, 都存在一个证书y, 且算法A可以用y来证明$x\in L$, 则算法A就验证了语言L.
复杂类NP
- 复杂类NP是能被一个多项式时间算法验证的语言类
- 一个语言$L\in NP$, 当且仅当存在一个2输入的多项式时间算法A和常数c, 满足
$L = \{x\in \{0,1\}^* : 存在一个证书y, |y|= O(|x|^c), 满足A(x,y)=1\}$ - $P\subseteq NP$
NP完全性与可归约性
- 如果任何一个NP完全问题能在多项式时间内得到解决, 那么NP中每一个问题都存在一个多项式时间解, 即P = NP
- HAM-CYCLE为NP完全问题
可归约性
- 问题Q可以被归约为另一个问题Q’: Q的任何实例都可以被”容易地重新描述”为Q’的实例, 而Q’的实例的解也是Q的实例的解
- Q可以转化为Q’, 则Q并不比Q’更难解决
- 定义: 语言$L_1$在多项式时间内可以归约为语言$L_2$, 记作$L_1 \le_p L_2$, 如果存在一个多项式时间可计算的函数$f: \{0, 1\}^* \to \{0, 1\}^*$, 满足对于所有的$x\in\{0, 1\}^*$, $x\in L_1$当且仅当$f(x) \in L_2 $, 则称函数f为归约函数, 计算f的多项式时间算法F为归约算法
- 如果$L_1, L_2\subseteq \{0,1\}^*$满足$L_1\le_p L_2$, 则$L_2\in P$蕴含$L_1\in P$
NP完全性
- 语言$L\in \{0,1\}^$是*NP完全的, 如果:
- $L\in NP$
- 对每一个$L’ \in NP$, 有$L’\le_p L$
- 如果语言L满足性质2, 但不满足性质1, 则称L是NP难度的
- NPC为NP完全语言类
- 电路可满足性问题CIRCUIT-SAT = {\
: C是一个可满足的不二组合电路}是NP完全的
NP完全性证明
- 如果语言L是一种满足对任意$L’ \in NPC$都有$L’\le_P L$的语言, 则L是NP难度的. 此外如果$L\in NP$, 则$L \in NPC$
- 证明一种语言L是NP完全语言的方法:
- 证明$L\in NP$
- 选取一种一致的NP完全语言L’
- 描述一种可计算函数$f(x)$的算法, 其中$f$可将L’中每一个实例$x\in \{0,1\}^*$映射为L中的实例$f(x)$
- 证明函数$f$满足对于所有的$x\in \{0,1\}^*$都有 $x\in L’$当且仅当$f(x)\in L$
- 证明计算函数$f$的算法具有多项式运行时间
公式可满足性
- 布尔公式可满足性问题是NP完全的:
- $SAT\in NP$:
- 对于输入$\phi$, 由它的一个可满足性赋值组成的证书可以在多项式时间内得到验证
- 方法为: 将公式中每个变量替换为其对应的值, 再求解
- CIRCUIT-SAT$\le_P$ SAT:
- 给定一个电路C, 可以直接在多项式时间内产生一个公式: 电路输出变量与描述每个门的操作的子句合取式的”与”
- 如果电路C有一个可满足性复制, 那么电路的每条线路都有一个良定义的值且输出为1, 赋值后$\phi$的每个子句的值为1, 合取值也为1. 反之存在一个赋值使$\phi = 1$, 则类似可证C可满足
- $SAT\in NP$:
3-CNF可满足性
- 3合取范式形式的布尔公式的可满足性问题是NP完全的
- 易证3-CNF-SAT $\in$ NP
- SAT $\le_P$ 3-CNF-SAT:
- 为输入公式$\phi$构造一棵二叉”语法分析”树, 将蚊子作为树叶, 连接词作为内部顶点, 从而把二叉语法分析树视作计算该函数的一个电路
- 为每个内部顶点的输出引入一个变量$y_i$, 把$\phi$ 改写为根变量与描述每个顶点操作的子句的合取的与, 每一个子句至多3个文字.
- 把所有子句转换为合取范式, 使子句都是CNF且至多包含3个文字
- 使用辅助变量p和q把每个CNF转为3-CNF
NP完全问题
团问题
- 证明3-CNF-SAT$\le_P$CLIQUE
- 设$\phi = C_1 \land C_2 \land \cdots \land C_k$是3-CNF形式中一个有k个子句的布尔公式
- 构造图G: 对$\phi$中的每个字句$G_r = (l_1^r \lor l_2^r \lor l_3^r)$, 把3个顶点$v_1^r, v_2^r, v_3^r$三元组放入V中.如果
- $v_i^r$和$v_j^s$处在不同的三元组中, 即$r\ne s$
- 他们相应的文字是一致的, 即$l_i^r$不是$l_j^s$的非
则用一条边连接顶点$v_i^r$和$v_j^s$
- 假设$\phi$有一个可满足性复制, 那么每个字句至少有一个文字$l_i^r$, 赋值为1, 对应顶点构成集合$V’$, 为团.
- 反之亦然
顶点覆盖问题
- VERTEX-COVER = {(G, k): 图G有一个规模为k的顶点覆盖}
- CLIQUE $\le_P$ VERTEX-COVER
- 包含团V’的无向图G, $\overline G$包含顶点覆盖V - V’
哈密顿回路问题
- VERTEX-COVER $\le_P$ HAM-CYCLE
旅行商问题
- TSP = {(G, c, k): G = (V, E)是一个完全图, c是V $\times$ V $\to$ Z的一个函数, $k\in Z$, G中包含一个最大花费为k的旅行回路}
- HAM-CYCLE $\le_P$ TSP
- G(V, E)是HAM-CYCLE的一个实例, , 构造TSP如下:
- 完全图G’ = (V, E’)
- 费用函数c(i, j) = 1若$(i, j) \in E$, 否则为0
- G(V, E)是HAM-CYCLE的一个实例, , 构造TSP如下:
子集和问题
- subset-sum problem
- SUBSET-SUM =$\{(s,t): \text{存在一个子集}S’ \subseteq S,\text{使得} = \sum_{s\in S’}s\}$
- 3-CNF-SAT $\le_P$ SUBSET-SUM: