我们在研究一个问题之前,首先得搞明白这个问题能不能解,如果能解,这个问题究竟有多难。而我们衡量一个问题有多难,则主要看该问题是否能够在多项式时间内可解。P问题、NP问题等名词的提出就是为了区分一个问题到底有多难。
如何判断一个问题有多难,主要看能解决该问题的算法的最低时间复杂度。假设 n n n表示输入数据的规模,那么 O ( n α ) O(n^\alpha) O(nα)表示多项式时间复杂度,是我们认为难度较低的。补充说明一下,像 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)这种,虽然没有长成多项式的样子,但是其复杂度低于 O ( n 2 ) O(n^2) O(n2),我们也默认其属于多项式时间复杂度。像 O ( 2 n ) , O ( n ! ) O(2^n),O(n!) O(2n),O(n!)等则表示非多项式时间复杂度,这一类难度则较大。
有些算法的时间复杂度不仅与数据规模有关,还与数据的大小有关。比如背包问题, n n n表示物品个数, m m m表示背包容量,背包问题的动态规划算法的时间复杂度是 O ( n m ) O(nm) O(nm)。那么对于这种时间复杂度不仅仅与数据规模有关,但是看起来又比较简单(即没有指数与阶乘),我们给它起了个新名字,叫拟多项式时间复杂度。拟多项式时间复杂度是介于多项式时间复杂度和非多项式时间复杂度之间的一种时间复杂度。
P问题、NP问题等概念都是针对判定性问题的。判定性问题,即只需要回答YES或者NO的问题。
话虽如此,但实际上很多问题都可以转化为判定性问题。比如求最大值的问题,可以转化为给定一个K,询问是否能够让某个值大于K。比如排序问题,可以在运行完排序算法之后,询问数据是否已经有序,从而把排序问题转换为判定性问题。这样就把研究问题的范围扩大了。
P代表了Polynomial,即多项式。
P问题:多项式时间可解的判定问题
P类问题:所有多项式时间可解的判定问题组成的问题类
P问题的例子比较好举,像排序问题就属于P问题。
NP的英文全称是Non-deterministic Polynomial,直译为多项式复杂程度的非确定性问题,也就是在多项式时间内不确定是否有解的问题。
NP问题:多项式时间可验证的判定问题
NP类问题:所有多项式时间可验证的判定问题组成的问题类
需要注意的是,不能简单地把问题分为P问题和NP问题。首先,这两类问题只是用来研究判定性问题的。其次,还有很多无法在多项式时间内验证的问题,这一类问题既不属于P问题,也不属于NP问题,这一类问题由于太难,所以研究价值比较低。最后,P问题与NP问题并不是对立的,显而易见,所有P问题都是NP问题,因为P问题既然多项式时间内可解,那么一定多项式时间内可验证。所以,P ∈ \in ∈NP。
NPC问题,即NP完全问题,是学者在研究“P=NP?”问题时提出的一个概念。
NPC问题:NP问题中最难的问题,所有NP问题都可以归约到该问题。
NPC类问题:NP问题中最难的问题不止一个,而是有很多这样的问题,且这些问题之间相互等价,这一类问题统称为NPC类问题。
NPC问题首先必须得属于NP问题。
如果能找到一个NPC问题的多项式时间解法,那么就可以证明P=NP;如果可以证明一个NPC问题没有多项式时间解法,那么就可以证明P ≠ \neq =NP。NPC问题在计算复杂性理论中的地位可见一斑。
SAT问题,即布尔可满足性问题。
SAT问题:输入为一个布尔表达式,询问是否存在一组布尔变量,使得该布尔表达式的值为TRUE。
举例:给定布尔表达式 ( x 1 ∨ x 2 ) ∧ ( ¬ x 2 ∨ x 3 ) ∧ ( ¬ x 1 ∨ ¬ x 3 ) (x_1 ∨ x_2) ∧ (¬x_2 ∨ x_3) ∧ (¬x_1 ∨ ¬x_3) (x1∨x2)∧(¬x2∨x3)∧(¬x1∨¬x3),询问是存在一组 ( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3),使得该表达式的值为TRUE。
输出:YES
分析:在布尔表达式中,∨表示并(or),∧表示交(and),¬表示非(not)。其实存在很多组变量取法,可以使得该表达式为TRUE,比如(1,0,0),(0,1,1)等。
这个问题也是第一个被证明出来的NPC问题。
划分问题又叫PAR问题(Partition Problem)。
划分问题:输入一些数,询问是否能将这些数划分为加和相等的两部分。
举例:给出如下数:1,11,3,4,5,请问能否将这些数划分为加和相等的两部分。
输出:YES
分析:1+11=3+4+5,可以将这些数划分为{1,11}和{3,4,5}。
注:该问题存在拟多项式时间解法,即用动态规划算法求出这些数相加可以组成的数,若总和的一半可以被组合出来,则问题有解。假设数据个数为 n n n,数据相加的总和为 m m m,则该算法的时间复杂度为 O ( n m ) O(nm) O(nm)。
NP-hard问题的中文是NP-难问题。
NP-hard问题的定义为:NP问题可以约化成的问题。
NP-hard问题的定义比较抽象。这里简单理解一下,NP-hard问题就是很难的问题,难到都不一定是NP问题了。值得一提的是,所有NPC问题都是NP-hard问题,毕竟NPC问题就是NP中最难的一类问题。
下图给出了P问题、NP问题、NPC问题和NP-hard问题的关系。
“P=NP?”问题是在理论信息学中计算复杂度理论领域里至今没有解决的问题,它被“克雷数学研究所”在千禧年大奖难题中收录。
此处,P代表了P类问题,NP代表了NP类问题。该千禧难题的含义为,是否所有多项式时间可验证的判定问题都能在多项式时间内可解。
本文简单介绍了P问题、NP问题、NPC问题、NP-hard问题。这些都是计算复杂性理论中的专有名词。希望能够对大家有帮助。