P,NP,NP Complete

来源:互联网 发布:it是哪个国家 编辑:程序博客网 时间:2024/05/03 00:39

计算机理论永远绕不开的一个话题就是“NP=P?”问题,这也是尚未被攻破的千禧年大奖难题之一。1971年史提芬·古克(Stephen A. Cook) 和 Leonid Levin相对独立的提出了下面该问题,对该问题的研究对于计算复杂度理论乃至整个计算机科学领域都有巨大的意义。

对于P,NP和NP Complete的定义常常使人混淆,比如经常听到有人说某某问题是NP的所以无解,究竟这种说法是否正确,我们接下来就对相关概念一一梳理。


1.何为P、NP、NP Complete

P指的是polynomial,字面意思即多项式。当一个问题能在多项式时间内解决时,我们就将称该问题的复杂度为P。具体来讲P类问题就是指能在O(1),O(logn),O(n),O(nlogn),O(n2),O(n3)...复杂度内解决的问题。
例如查找无序向量中的最大值在O(n)的时间复杂度能能解决,则这个问题就是P类问题。

那P指的是polynomial,NP就是“no polynomial”吗?naive!NP指的是nondeterministic polynomial,这个拗口的词简单来理解就是:有一个问题p和一个解x,能在多项式时间确定x是不是p的解,则这个问题就是NP类问题。
继续考虑上述找向量最大值的问题,根据P和NP定义,这个问题既是P类问题,因为它能在多项式时间内找到最大值;它也是NP类问题,因为给出一个数可以在多项式时间内判断它是不是最大值。

再看另一个概念:NP完全问题(NP Complete, NPC),又称NP完备问题。即一个问题x,没办法或者暂时没办法在P时间解决(x∉P),但可以在P时间判断某结果是不是x的解(x∈NP)则x是一个NP完全问题。

所以P,NP,NPC就是如下关系:


"P=NP?"问题简单来讲就是NP Complete问题是否存在的问题。

2.3-SAT问题

经典的NP Complete问题如3-SAT问题,不太严谨的表述如下:
有一组布尔型变量:X1,X2,X3,...,Xn,将其组合成形如这样一种式子(CNF形式):()&&()&&()&&...&&(),括号可以是任意个。每个括号内选取任意三个布尔变量或则其对其取反,例如X1,X2,!X3,并用或符号“||”将其连接。例如布尔型变量组为:X1,X2,X3,X4,X5, 最终得到形式为如:(X1 || X2 || X3) && (X1 || !X2 || !X3) && (!X1 || X4 || X5)所谓3-SAT问题就是:有没有一组X1,X2,X3,...,Xn的取值,使得整个式子的运算结果为true。

为什么说3-SAT问题是NP Complete问题呢?
首先它显然是NP类问题:把待验证取值序列x1,x2,x3,...,xn代入式子算一下最终结果是不是true即可,在O(1)就能解决。
那么反过来,有没有一种方法能够在多项式时间内求出能满足该式子运算结果为true的取值序列?目前没有方法,所以说3-SAT问题是NP Complete问题。
目前只能够用穷举每一个X取值的方法来寻找解,这种方法是O(2^n)的复杂度,显然不是P时间复杂度。

一个有趣的理论是:任何NP Complete问题都能在多项式时间内互相“转化”。具体是指什么呢,我们继续举例来说明。

3.CLIQUE问题

来看另一个典型的NP Complete问题:CLIQUE问题。
考虑完全图:直观来讲,若一个无向图其每个不同定点间有且仅有一条边相连,则这个无向图就是完全图。
例如下图a,b,c



所有无向图都是他自身的团(clique)。团的定义为:对于给定图G=(V,E)。其中,V={1,…,n}是图G的顶点集,E是图G的边集。图G的团就是一个两两之间有边的顶点集合。n个顶点的完全图就是k=n的clique。

例如下图d,找出k=3的clique:


显然能一眼看出两个k=3的clique:

当k=4,5,6..时就不能找出相应的clique了。
由此我们定义CLIQUE问题定义:
给出一个无向图G,度数n,能否在G中导出k=n的clique。
(与此相关的最大团问题即找出度数最大的clique)。

那么为什么说QLIQUE问题是NP Complete问题呢?
与3-SAT问题分析方法类似,当我们给出一个G的子图和一个n时,我们能在多项式时间内判断该子图是不是一个k=n的团。
但是反过来我们没有办法在多项式时间内找到问题的解———是否存在这样的子图。由此,CLIQUE问题也是一个NP Complete问题。

而另一种证明方式就用到那个有趣的理论了:将一个已知的NP Complete问题转化为CLIQUE问题,即能证明CLIQUE问题是NP Complete问题。
我们一般将3-SAT问题作为基本问题来转换

4.3-SAT与CLIQUE的转换

下面考虑将3-SAT问题转化为CLIQUE问题。
例如一个3-SAT问题表达式如下:

将每一项当作一个节点,每个节点和其他括号内除了与他自身相反的点相连,例如将最后一个括号内X2点与其他点相连

依次对其他点做相同操作,最终连线效果为:



这样就将3-SAT问题图形化表示了出来。
显然,求解原3-SAT问题就转化为在上图中寻找是否有k=3的clique的问题。(k的大小即3-SAT表达式中括号的数量)

例如我们能找到这样一个k=3的clique(图中红色三角形)



既然能找到k的数目为括号数目的clique,则说明原3-SAT问题是有解的,而每个clique都是一个满足表达式为true的解(如图中X1=0,X2=1,X3=1),当然解不一定只有一个。
实际上从乘法分配的角度来看,就是将原表达式去括号后变成一个X1X2...Xn + !X1X2...Xn + X1!X2...Xn的形式(析取式),只要有一项满足true,最终结果就是true了(本质就是 最小项 的定义)

至此,我们成功将3-SAT问题转化为了相应的CLIQUE问题,其他NP Comolete问题也可以相互转换。

这篇文章是我依据各种零散的资料对计算复杂度的粗浅理解,其中很多概念还是很模糊,行文措辞不够严谨,望见谅。


原创粉丝点击