本文来自我的个人博客 https://www.zhangshenghai.com/posts/64398/
P问题、NP问题、NPC问题的概念
老师上课时强调过本章对于概念要特别清楚,因此首先给出这三个问题的概念:
P问题:能够在多项式时间内解决的问题。
NP问题:能够在多项式时间内验证一个解的正确性的问题。
-
NPC问题:当一个问题满足下面两个条件的时候,那么这个问题是NPC问题。
- 首先,它是NP问题。
- 其次,所有其他的NP问题都能够在多项式时间内归约到此问题上(NP-hard)。
NPC问题是NP问题的子集。
-
NP-hard问题:问题A不一定是一个NP问题,但是所有的NPC问题都可以在多项式时间内转化为A,则称A为NP-hard问题。
NPC问题一定是NP-hard问题。
一些典型的NP完全问题
通过问题变换的技巧,可以将2个不同问题的计算复杂性联系在一起。这样就可以将一个问题的计算复杂性归约为另一个问题的计算复杂性,从而实现问题的计算复杂性归约。
证明一个问题是NP完全问题分为两个步骤:
证明该问题是NP问题。
-
证明NP问题中的每一个问题都能在多项式时间内归约为该问题。
由于多项式问题具有传递性,因此只需证明一个已知的NP完全问题能够在多项式时间内归约到该问题即可。
下图给出了进行NP完全证明的结构,树的根为CIRCUIT-SAT。
电路可满足性问题(CIRCUIT-SAT)
由《算法导论》第二版引理34.5:电路可满足性问题属于NP类,以及引理34.6:电路可满足性问题是NP难度的,结合NP完全性的定义可直接推出结论:
电路可满足性问题是NP完全的。
合取范式的可满足性问题(SAT)
证明:
-
SAT ∈ NP:
给定该问题的一个实例,用证书y={1, 1, 1}作为输入,对于给定的布尔公式x,我们都能按照布尔公式的数学运算规则在多项式时间内求解出来。
-
在多项式时间内将Circuit-SAT归约到SAT:
将电路中的输入用布尔变元表示,将电路中的每一个逻辑门用布尔公式来对应,就可以将Circuit-SAT问题归约到SAT问题。
显然,这是在多项式时间内完成的,因此SAT是NP完全问题。
三元合取范式的可满足性问题(3-CNF-SAT)
在这个问题的证明之前先补充一下合取范式(CNF)的定义。
如果一个布尔公式可表示为所有字句的“与”,且每个字句都是一个或多个文字的“或”,则称该布尔公式为合取范式(CNF)。
如果公式中的每个字句恰好都有三个不同的文字,则称该布尔公式为3-CNF。
例如,布尔公式
就是一个3-CNF,其三个字句中的第一个为,它包含3个文字
,
,
。
证明:
-
3-CNF-SAT ∈ NP:
这里的证明与上面的SAT问题是类似的。同样给定一个证书y作为输入,对于一个给定的合取范式,都可以在多项式时间内验证合取范式的值是1还是0。
-
在多项式时间内将SAT归约为3-CNF-SAT:
由于这里的证明对离散数学的要求较高,且老师上课时也没有细讲这部分内容,故只给出步骤,详细的证明可参考《算法导论》第二版定理34.10。
Ⅰ. 为输入公式画出一棵二叉“语法分析”树,文字作为树叶,连接词作为内部顶点。
Ⅱ. 把每个字句变换为合取范式。
Ⅲ. 继续对公式进行变换,使每个字句恰好有三个不同的文字。
从上面的步骤可以看出,SAT可以在多项式时间内归约到3-CNF-SAT,因此3-CNF-SAT是NP完全问题。
团问题(CLIQUE)
证明:
- CLIQUE∈NP:
对于给定的图G(V, E),如果给定顶点集V'作为证书,我们可以验证对于任意一对顶点u, v∈V', 通过检查边(u, v)是否属于E,从而验证V'是否是一个团。显然,这是在多项式时间内完成的。
-
在多项式时间内将3-CNF-SAT归约到CLIQUE:
给定一个含有k个字句的3-CNF,假定其是可满足的,即3-CNF的结果为1。我们总是可以构造一个3k个顶点的图,构造方法是在不同的三元组、且不是自己的非的节点之间连线。
一共有k个分组,每个分组中的节点之间不能互相连接,而且这个3-CNF是可满足的。那么每个分组都会有一个节点与其他分组的节点相连,将每个分组的选出的那个节点互相连接起来,就是最大团。显然,最大团有k个节点。
下面给出《算法导论》中的一个k=3的实例,图中浅色的节点为每个分组中选出的节点。即3-CNF-SAT的一个可满足赋值为
。
归约过程在多项式内可以完成,因此团问题是NP完全问题。
顶点覆盖问题(VERTEX-COVER)
证明:
-
VERTEXT-COVER∈NP:
对于给定的图G(V, E),如果给定顶点集V'作为证书,对于每条边(u, v)∈E,我们可以检查是否有u∈V'或v∈V'。这一验证在多项式时间内即可完成。
-
在多项式时间内将CLIQUE归约到VERTEX-COVER:
设G=(V, E)是CLIQUE的一个实例,设G的最大团为V',取图G的补图,设补图上的边为E',补图上的点为V-V',那么V-V'是一个顶点覆盖。
原理:从E'中取任意的一条边(u, v),那么在G中,边(u, v)是不存在的,那么u或v至少有一个在V-V'中。由于边(u, v)是任意取自E'的,即在补图中,任意一条边上都至少有一个点是属于V-V'的,即满足顶点覆盖的定义。
下面给出一个例子,V' = {u, v, x, y},V-V' = {z, w}。
同样,这个归约过程能够在多项式时间内完成,因此顶点覆盖问题是NP完全问题。
哈密顿回路问题(HAM-CYCLE)
证明:
-
DIR-HAM-CYCLE∈NP:
对于一个给定的图G(V, E),我们可以简单验证一个顶点序列是否经过所有顶点一次且仅一次,而且最后能够回到源点。这个过程显然是在多项式时间内完成的。
-
在多项式时间内将3-CNF-SAT归约到DIR-HAM-CYCLE:
-
构造一个能够表达3-CNF中的文字和子句的图结构,每行中的节点代表3-CNF中的每个文字,如第一行中的节点都代表了x1,那么跨行之间的节点之间即可代表3-CNF中的字句。
如果不清楚文字和字句的概念,可以参考上面3-CNF中关于合取范式的定义。
-
- 首先进行一个定义:当
时,遍历的顺序是从左到右,当
时,遍历的顺序是从右到左。从最上面的源点出发,以某种方式连接这些点以满足3-CNF,只要满足图中的3-CNF,那么这个图就是有向哈密顿回路。这个过程是在多项式时间内完成的。
接下来还要进行另外一个归约,才可以达到我们的目标:
-
HAM-CYCLE∈NP:
与DIR-HAM-CYCLE的验证方法相同,这里不再赘述。
-
在多项式时间内将DIR-HAM-CYCLE归约到HAM-CYCLE:
给定一个具有n个顶点的有向图G=(V, E),可以在多项式时间内构建一个具有3n个顶点的无向图G'
以上两个归约都是在多项式时间内完成的,故哈密顿回路是NP完全的。
旅行商问题(TSP)
证明:
-
TSP∈ NP:
给定该问题的一个实例,用n个顶点组成的回路作为证书,我们可以验证该回路是否只包含每个顶点一次,并且检查各边费用之和是否小于k。这个过程能够在多项式时间内完成。
-
在多项式时间内将哈密顿回路归约到TSP:
设G=(V, E)是HAM-CYCLE的一个实例,可以构造对应的一个TSP实例。建立一个完全图G‘=(V, E'),定义费用函数c为:
然后求解完全图G'上最大限定花费为0的路线即可。
下面来说明当且仅当图G'中有一个费用至多为0的回路的时候,G中才具有一个哈密顿回路:
- 假定图G中有一个哈密顿回路h。h中的每条边都属于E,因此在G’中的费用为0。因此,h在G‘中是费用为0的回路。
- 反之,假定图G’中有一个费用h‘至多为0的回路,回路上每条边的费用必为0。因此,h’仅包含E中的边。
- 这样,我们就得出结论,h’是图G中的一个哈密顿回路。
上述归约过程在多项式时间内完成,故旅行商问题是NP完全的。