P问题、NP问题、NPC问题

   看师兄们的论文经常说一句这是个NP难问题,所以采用另外一种方法来代替(比如凸松弛,把l0范数的问题松弛为l1范数的问题来求解)。然后搜索了相关知识,也还是没看太懂,把一些理论知识先贴上来,希望以后再接触到会有更好的理解。

参考来源:http://blog.csdn.net/jbb0523/article/details/40710449


》简要介绍

(简单介绍了相关概念和从属关系,若时间不紧可详细看下文中的相关解释)

一、相关概念

  P: 能在多项式时间内解决的问题

  NP: 不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时间验证的问题

  NPC: NP完全问题,所有NP问题在多项式时间内都能约化(Reducibility)到它的NP问题,即解决了此NPC问题,所有NP问题也都得到解决。

  NP hard:NP难问题,所有NP问题在多项式时间内都能约化(Reducibility)到它的问题(不一定是NP问题)。

二、四者联系的图形表示

  将四种问题用集合表示,它们的关系图1所示。

图1 P NP NPC NPhard关系的图形表示

 

  说明:

  1. P问题属于NP问题,NPC问题属于NP问题。

  2. NPC问题同时属于NP hard问题,是NP与NPhard的交集。


》时间复杂度 

  时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂度,甚至O(n!)的阶乘级复杂度。不会存在O(2*n^2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。同样地,O (n^3+n^2)的复杂度也就是O(n^3)的复杂度。因此,我们会说,一个O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O(n^2)。我们也说,O(n^100)的复杂度小于O(1.01^n)的复杂度。

     容易看出,前面的几类复杂度被分为两种级别,其中后者的复杂度无论如何都远远大于前者:一种是O(1),O(log(n)),O(n^a)等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置;另一种是O(a^n)和O(n!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。

     总结来说,多项式复杂度的比指数级复杂度的算法要好很多。


》约化(规约reducibility)

     规约就是说一个问题A可以在多项式时间转化为问题B,然后问题A有解当前仅当转化后的问题B有解,也就是说只要解决了B那么就可以解决A,注意这个转化是单向的,比如你可以用解二次方程的方法解一次方程,但是反过来却不行。(一元二次方程的二次项系数为0时可用B问题解决方法来求解A问题,即一次方程。)

    “问题A可约化为问题B”有一个重要的直观意义:B的时间复杂度高于或者等于A的时间复杂度。也就是说,问题A不比问题B难。

     约化具有一项重要的性质:约化具有传递性。如果问题A可约化为问题B,问题B可约化为问题C,则问题A一定可约化为问题C。


》P问题

P是指在多项式时间能由确定型图灵机解决的问题

如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。


》NP问题

NP问题是指在多项式时间内能由非确定型图灵机解决的问题

     NP问题不是非P类问题。NP问题是指可以在多项式的时间里验证一个解的问题。NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。

     之所以要定义NP问题,是因为通常只有NP问题才可能找到多项式的算法。我们不会指望一个连多项式地验证一个解都不行的问题存在一个解决它的多项式级的算法。

    确定型图灵机可以理解为就是按照某种固定的算法,一步步求出解的程序,而非确定型图灵机其实是概念上的,他的理论价值更大一些,他是指某个程序rp非常好,能猜出答案。怎么叫猜出答案呢,举个例子比如说哈密顿问题(是说经过图上的所有点一次且仅一次的路径),程序猜出了个路径ACDEFB啥的,然后程序要自己看看这个路径是不是哈密顿路,验证了一下,我勒个去,还真是,于是答案就出现了。所以这里的猜是指给出一个正确的答案,就是不仅猜出了个答案,还要自己验证一下是不是正确的,所以在有些地方解释NP就是说能在多项式时间验证的问题就是NP的,也不能说不对吧。


》提出一个问题P=NP?

     所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。

     →关键是,人们想知道,是否所有的NP问题都是P类问题?

     →普遍趋向于不等于


》NPC问题

     有个叫Cook的人发现所有的NP问题都可以规约到一种叫做SAT的问题,也就是说只要SAT能有效的解决,所有问题都能利这种方法经过相应转化而有效解决,后来人们发现所有的问题能规约到的问题不止一种,而是一大类,有很多个,这类问题就被称作NP-complete问题,俗称NP完全问题,就是说这类问题是np里最难的,所有的NP问题都可以规约到他们。到这里我们注意到NPC问题是有两个条件的:

     →首先,它得是一个NP问题

     →然后,所有的NP问题都可以约化到它

     证明一个问题是 NPC问题也很简单。证明它至少是一个NP问题,证明其中一个已知的NPC问题能约化到它(由约化的传递性,则NPC问题定义的第二条也得以满足;至于第一个NPC问题是怎么来的,下文将介绍),这样就可以说它是NPC问题了。

    既然所有的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,NP也就等于P了。因此,给NPC找一个多项式算法太不可思议了。因此,前文才说,“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。


》NP-hard问题

     NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广)。NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。

      

 

posted @ 2017-09-08 10:06  闪电gogogo  阅读(1542)  评论(0编辑  收藏  举报