大部分时间内,我们研究的算法都是多项式时间算法:对于规模为n的输入,在最坏情况下的运行时间是 O ( n k ) O(n^k) O(nk),其中k是某一确定常数。那是否所有的问题都可以在多项式时间内解决呢?答案是否定的。本节的主体就是对问题的复杂性的研究。
目录
一 问题
- 问题:由
Input
和Output
两部分组成 - 实例:是由一个具体的输入
Input
按照问题的类型可以粗略的将问题分为两个类别:
-
最优化问题:每一个可行解都有一个关联的值,我们希望找出一个具有最佳值的可行解。
-
判定问题:答案是简单的是和否
决策问题与优化问题可以互相转化:
- 通过对待优化的值强加一个界,可以将最优化问题转换为相关的判定问题。
- 判定问题可以通过反复利用二分查找询问是否可以优化。
当我们试图证明最优化问题不易处理时,就可以利用该问题相关的判定问题之间的关系,判定问题要更容易一些。如果某个最优化问题比较容易,那么其相关的判定问题也会比较容易,如果我们能提供证据表明某个判定问题是个困难问题,就等于提供 l证据表明相关的最优化问题也是困难问题。NP完全性理论更注重与判定问题。
二 归约算法
假设对于某个判定问题A,我们希望能在多项式时间内解决他。假设有另一个不同的判定问题B,我们知道如何在多项式时间内解决它。最后假设有一个过程,它可以将任意A的实例a转化为B的具有以下特征的某个实例b:
- 转化操作需要多项式时间
- 两个实例的解是相同的:a的解是
是
,当且仅当b的解也是是
我们称这一过程为多项式时间归约算法reduction
。一般我们用
A
≤
p
B
A\leq_{p}B
A≤pB表示A可以归约为B下面给出一种在多项式时间内解决A的方法:
- 给定问题A的实例a,利用多项式时间归约算法,将它转化为问题B的实例b
- 在实例b上,运行B的多项式时间判定算法
- 将b的解作为a的解
接下来介绍几个归约的例子
2.1 3-CNF-SAT ≤ p \leq_{p} ≤pCLIQUE
-
3-CNF-SAT问题
可满足性(SAT):如果一个布尔公式 ϕ \phi ϕ的具有一个赋值(可满足性赋值)使得公式的值为1,表示该公式是可满足公式。
可满足性问题:给定一个布尔公式是不是可满足公式。例如一个简单的布尔公式 ϕ = x 1 ∧ x 2 \phi=x_1\wedge x_2 ϕ=x1∧x2当 ( x 1 = 1 , x 2 = 1 ) (x_1=1,x_2=1) (x1=1,x2=1)时值为1,说明该公式具有可满足赋值,是可满足公式。
我们用以下术语定义
3SAT
问题:- 布尔公式中的文字
literal
:是指一个变量或变量的非 - 合取范式
CNF(conjunctive normal form)
:布尔公式可以表示为所有子句的与,每个子句都是一个或多个文字的或
如果合取范式中每个子句恰好都有三个不同的文字,则称该布尔公式为
3-CNF
,3-CNF
的可满足性问题问题就是3-CNF-SAT
问题。下面的布尔公式就是一个典型的3-CNF
( x 1 ∨ ¬ x 2 ∨ ¬ x 3 ) ∧ ( ¬ x 1 ∨ x 2 ∨ x 3 ) ∧ ( x 1 ∨ x 2 ∨ x 3 ) (x_1\vee \neg x_2 \vee \neg x_3)\wedge(\neg x_1\vee x_2 \vee x_3)\wedge( x_1\vee x_2 \vee x_3) (x1∨¬x2∨¬x3)∧(¬x1∨x2∨x3)∧(x1∨x2∨x3) - 布尔公式中的文字
-
CLIQUE问题
无向图
G=(V,E)
中的团clique
是一个顶点子集 V ′ ⊆ V V'\subseteq V V′⊆V,其中每对顶点都由一条边来连接,一个团是G的完全子图。团问题:是关于寻找图中规模最大的团的最优化问题。作为判定问题形式为:图中是否存在一个给定规模为
k
的团。
证明3-CNF-SAT
≤
p
\leq_{p}
≤pCLIQUE:设
ϕ
=
C
1
∧
C
2
∧
.
.
.
∧
C
k
\phi=C_1\wedge C_2\wedge ...\wedge C_k
ϕ=C1∧C2∧...∧Ck是一个3—CNF
具有k个子句的布尔公式,每个子句
C
r
C_r
Cr恰好有3个不同的文字
l
1
r
,
l
2
r
,
l
3
r
l_1^r,l_2^r,l_3^r
l1r,l2r,l3r,我们构造一个图G
使得
ϕ
\phi
ϕ是可满足的,当且仅当G
包含一个规模为k
的团:
构造:对于公式中的每个子句中的每个文字,用一个顶点表示。如果下面两个条件同时满足,就连接这两个顶点:
- 这两个顶点代表的文字处于不同的子句中。
- 这两个顶点代表的文字不是对方的
非
。
证明:
-
公式 ϕ \phi ϕ有一个可满足赋值,那么每个子句 C r C_r Cr中至少有一个文字 l i r l_i^r lir的值为真,从每个子句中挑选出一个这样的文字对应的顶点组成顶点集
V'
,可以断言V'
在G中是一个团。因为这两个文字都被映射为1,自然不能互补。 -
反之从图G中选出一个规模为
k
的团,由于团中顶点不在同一个三元组内(子句),且其赋值为1,公式 ϕ \phi ϕ也是可满足的。
2.2 CLIQUE ≤ p \leq_{p} ≤p VERTEX COVER
无向图的顶点覆盖是一个子集 V ′ ⊆ V V' \subseteq V V′⊆V,满足如果有 ( u , v ) ∈ E (u,v)\in E (u,v)∈E则 u ∈ V u \in V u∈V或 v ∈ V ′ v \in V' v∈V′或两者同时成立。也就是说 V ′ V' V′内的顶点相关联的边覆盖G中的边集E。
顶点覆盖问题VERTEX COVER
:是指在给定的图中找出最小规模的顶点覆盖,将最优化问题转化为判定问题就是,确定一个图是否具有一个给定规模k
的顶点覆盖。
构造:给定一个团的实例 < G = ( V , E ) , k > <G=(V,E),k> <G=(V,E),k>,构造一个顶点覆盖的实例 < G ‾ = ( V , E ‾ ) , k ′ > <\overline{G}=(V,\overline{E}),k^{'}> <G=(V,E),k′>, G ‾ , E ‾ \overline{G},\overline{E} G,E代表G的补图与G的补图的边集。图G有k规模的团当且仅当G的补图 G ‾ \overline{G} G有 ∣ V ∣ − k ′ |V|-k' ∣V∣−k′规模的顶点覆盖。
证明:
- 假设有一个规模为k的团 < G = ( V , E ) , k > 其 中 V ′ ⊆ V <G=(V,E),k> 其中V'\subseteq V <G=(V,E),k>其中V′⊆V,任意 ( u , v ) ∈ E ‾ (u,v)\in \overline{E} (u,v)∈E,u与v至少有一个属于 V − V ′ V-V' V−V′的集合中,这就意味着任意 ( u , v ) ∈ E ‾ (u,v)\in \overline{E} (u,v)∈E是被 V − V ′ V-V' V−V′所覆盖。这样就形成了一个顶点覆盖的实例 < G ‾ = ( V , E ‾ ) , k ′ > <\overline{G}=(V,\overline{E}),k^{'}> <G=(V,E),k′>
- 反之,假设 G ‾ \overline{G} G具有一个顶点覆盖 V ′ ⊆ V V'\subseteq V V′⊆V其中 ∣ V ′ ∣ = ∣ V ∣ − k |V'|=|V|-k ∣V′∣=∣V∣−k,那么对于任意 ( u , v ) ∈ E ‾ (u,v)\in \overline{E} (u,v)∈E,至少有一个顶点属于V’,因此 V − V ′ V-V' V−V′是一个规模为k的团
三 问题复杂类:P与NP
问题复杂类关注的是当问题的输入规模n
增加时资源需求的增长率。所讨论的资源可以是时间(本质上是一个抽象机器上的基本操作的数量),也可以是(存储)空间。它是一种抽象的度量,不以秒或字节为单位给出所需的时间或空间
- P类问题:可以在多项式时间内解决的决策问题
- NP类问题:一组决策问题的实例,其答案是Yes,其解可在多项式时间内被验证。
例如哈密顿回路问题:无向图G=(V,E)
中的一条哈密顿回路是通过V
的每一个顶点的简单回路,具有这种回路的图被称为哈密顿图。给定一个图,是否存在哈密顿回路。
要验证这个问题是否是一个NP问题,提供一个答案为Yes的实例,我们要在多项式时间内验证这个实例是否是一个回路,只需要遍历这个实例看是否经过所有的顶点即可。
对于P与NP,存在以下关系: P ⊆ N P P \subseteq NP P⊆NP,证明过程很简单:对于任何P类问题存在多项式时间内的算法解决它,那么对于任意一个P类问题的解,只需要用这个解解决问题,就可以在多项式时间内验证它。
P=NP?
四 问题复杂类:NPC与NP-hard
因为对于P=NP?
研究进展的缺乏,另一个新的问题被提出:NP类问题中最难的问题是什么?对于这一类问题被称为NP完全问题(NPC)。这类问题有着惊人的特质:任意一个NP完全问题能在多项式时间内被解决的话,那么NP类问题中的每一个问题都存在一个多项式的解,这样就能证明P=NP
。
对于NP-Complete
的定义:Y是一个NP完全类,当且仅当Y是一个NP类问题且对于任意NP问题X,X都可以归约为Y。前面的团问题、顶点覆盖、哈密顿回路、旅行商问题,集合覆盖问题就是典型的NP完全类问题。
若Y不满足是一个NP类问题的条件,则称Y是一个NP难问题(NP-hard)
计算机科学家眼中的问题复杂类的关系:
给出一个思考题:答案为D
五 证明NP-Complate
证明一个问题是NPC类问题的主要依据是以下定理:
如果X是一个NPC类问题,Y是一个NP类问题且X可以归约为Y,那么Y就是一个NPC类问题
因此证明Y是一个NPC类问题主要有三个步骤:
- 证明Y是一个NP类问题。
- 选择一个合适的NPC类问题X。
- 证明X ≤ p \leq_{p} ≤pY。
以集合覆盖问题为例:
- 输入:一个大小为n的全集
U
,一系列集合 S = { S 1 , S 2 , . . . , S m } S=\{S_1,S_2,...,S_m\} S={S1,S2,...,Sm},每个集合都是U的子集,以及一个整数k
- 输出:是否存在 ∣ C ∣ < k |C|<k ∣C∣<k的子集合 C ⊆ S C\subseteq S C⊆S,使得 ∪ S i ∈ C = U \cup_{S_i\in C}=U ∪Si∈C=U。
-
证明集合覆盖问题是NP问题
初始化一个数组用于标记全集U中的元素是否出现,遍历一个可行解S’,标记S’中出现过的元素,最后检查数组即可,在多项式时间内即可验证
-
选择一个NPC类问题:顶点覆盖问题:
-
证明顶点覆盖问题可以归约到集合覆盖问题。
构造:给定一个顶点覆盖的实例: < G = ( V , E ) , k > <G=(V,E),k> <G=(V,E),k>,构造一个集合覆盖的实例 < U , S , k > <U,S,k> <U,S,k>,其中 U = E U=E U=E,对于任意 v ∈ V v\in V v∈V,构造集合 S v = { e ∈ E a n d e = ( u , v ) } S_v=\{e\in E\;and\;e=(u,v)\} Sv={e∈Eande=(u,v)}(对于每个顶点构造一个与该顶点相连的边集作为一个子集)
证明:对于任意一个大小为k的顶点覆盖集合,与其相连的边的并集为全体边集,因此这些顶点对应的 S v S_v Sv的并集也等于全集U(全体边集),反之亦然。
因此集合覆盖问题就是NP-Complete
类问题。