P类、NP类、NPC类、NP_Hard类问题

P类、NP类、NPC类、NP-Hard类

在介绍P、NP和NPC问题之间的联系和区别之前,简单介绍一下复杂性理论中基本概念是十分必要的。

时间复杂度:时间复杂度并不表示一个程序/算法解决一个问题所花费的时间,而是当问题的规模扩大后,解决该问题所需要的时间增长得有多快,即当问题所涉及到的数据规模变大到数百倍甚至数万倍后,程序解决问题所需要的运行时间是否维持不变,或者随之也增加数百倍或者数万倍。
【1】常数级复杂度:无论问题的规模有多大,解决问题的程序所需要的时间始终不变,则该程序具有O(1)的时间复杂度。
【2】线性级复杂度:若问题的数据规模变多大,程序运行时间也跟着增多大,即两者之间是一元一次函数的关系,则该程序具有O(n)级复杂度。若两者之间是一元二次函数的关系,则该程序具有O(n2)级复杂度。
【3】指数级复杂度:若问题的规模变大时,程序/算法运行所需要的时间成几何阶数上升,如一些穷举类算法,则这些程序/算法具有O(an)级复杂度。
【4】阶乘级复杂度:若解决问题的程序所需运行时间与问题的规模扩大成阶乘函数关系,则该程序具有O(n!)级复杂度。

通常,上面几种类型的复杂度会被分为两种:(1)多项式级复杂度:通常解决问题的程序所需运行时间与问题的规模是线性多项式函数关系,通常问题规模参数n出现在底数的位置,如O(1),O(log(n)),O(na)等。(2)非多项式级复杂度:如O(an),O(n!),其复杂度是目前计算机不能处理的。
一般,我们在解决一个问题时总是希望可以找到一个相应的多项式级复杂度的程序/算法。然而,现实中并不是所有的问题都可以找到对应的多项式级复杂度的算法。甚至,有些问题根本找不到一个正确的算法。

规约:若一个问题A可以规约到另一问题B,则可以用问题B的解法解决问题A,或者问题B的解决可以帮助解决问题A。
例如:《算法导论》中一个经典例子
求解一元一次方程的问题是可以规约到一元二次方程的求解问题,即知道如何解一元二次方程那么一定能够解出一元一次方程。若我们可以写出两个程序分别对应两个问题,那么我们可以找到一个"规则",按照这个规则将解一元一次方程程序的输入改变一下,用在解一元二次方程上,则这两个程序得到的结果是一样的。这个规则为:两个方程的对应项系数不变,一元二次方程的二次项系数为0,即任一个一元二次方程(判别式不为0)都可以分解为一元一次方程组。按照这个规则可以把前一个问题转换为后面一个问题,这样两个问题是等价的。
注意:
1:“问题A可规约到问题B”的重要的复杂性理论意义:解决问题B的算法时间复杂度高于解决A的时间复杂度,即问题A不比问题B难。如上面所提到的,解一元二次方程比解一元一次方程难,因为前者的求解方法可以用来解决后者。
2:规约的传递性:若问题A可规约到问题B,且问题B可规约到问题C,则问题A必可规约到问题C。
3:“多项式”规约:通常所说的"可规约"是指可“多项式”规约,即变换输入的方法是能在多项式时间内完成,因为规约的过程只有在多项式时间内完成才有意义。

P类问题
该类问题是指可以找到一个能在多项式时间内解决它的算法。

NP类问题
值得注意的是,NP类问题并不是非P类问题。该类问题是指可以在多项式时间内验证一个解,但不能或者不确定能在多项式时间内能解决的问题。换句话说,可以在多项式时间内猜出一个解的问题。当然,非NP类的问题也是存在的,即问题的解被猜到了但是没用,因为其不可能在多项式时间内被验证。
但是,P类问题都属于NP类问题。也就是说,能在多项式时间内解决一个问题,必定可以在多项式内验证一个问题的解——因为求一个问题的解往往比验证一个问题的解要难得多!现在,所有对NP问题的研究都集中在是否有NP=P?目前为止,该问题还没有被学者们证实。人们普遍认为,NP=P是不成立的,这是因为在研究NP问题的过程中找出了一类非常特殊的NP问题—NP完全问题,即NPC问题。
NP类问题的意义:之所以要定义NP类问题,是因为通常只有NP类问题才有可能找到多项式复杂度的算法。人们不会指望一个连多项式时间内都不能验证一个解的问题存在一个可以解决它的多项式级的算法。

NPC类问题
从上面规约的定义,我们可以理解到:一个问题规约到另一个问题,时间复杂度会增加,问题的应用范围也随之增加。因此,我们通过对某些问题的不断规约,能够找到复杂度更高但应用范围更广的算法来代替复杂度低且只能解决一小类问题的算法。结合规约的传递性及P和NP问题的关系,通过不断地规约,总能找到一个稍复杂的大NP问题能"通吃"若干小的NP问题。这样,我们就可以找到一个复杂度最高的超级NP问题,所有的NP问题都可以规约到它。即只要解决了这个问题,那么所有的NP问题都可以被解决。不可思议的是,这样的超级NP问题不只一个,它是一类问题。而这类问题通常被称为NP-完全问题,即NPC问题。

若一个问题是NPC问题,则它需要具备以下两个性质:
1:它是一个NP问题。
2:所有的NP问题都可以规约到它。
目前,NPC问题没有多项式时间复杂度的有效算法,只能用指数级甚至阶乘数级复杂度的算法进行搜索。

NP-Hard类问题
这类问题满足NPC问题性质中的第二条,但不一定满足第一条,即它不一定是NP问题。由此可见,NP-Hard问题要比NPC问题的范围更广。NP-Hard问题也难以找到多项式复杂度的算法。由于NP-Hard问题放宽了限制条件,它将有可能比所有的NPC问题的时间复杂度更高而难以解决。

为了便于理解,下面将给出相应的例子和关系图:

例子
P类问题:排序问题。
NP类问题:大数分解问题。随便给你一个非常大的数(该数由两个非常大的素数相乘得来),你没法很快将其分解为两个素数的乘积,但若是把这两个素数告诉你,你可以很快的验证它是由这两个素数相乘得来(即多项式时间可验证)。
NPC类问题:哈密顿回路问题。给你一个图,问你能否找到一条经过每个顶点一次且恰好一次(不遗漏也不重复)最后又走回来的路(满足这个条件的路径叫做Hamilton回路)。
NP-Hard类问题:如找一个完美女友/男友(嘻嘻)。

关系图
P类、NP类、NPC类、NP_Hard类问题_第1张图片
声明:本文章是本人在其他博主的文章上学习整理获得的。相关链接为:http://blog.csdn.net/crfoxzl/article/details/2192957。

你可能感兴趣的:(复杂性理论)