P问题
可以在多项式时间内求解的问题。
“P” 代表 “polynomial time” 。
NP问题
可以在多项式时间内检查解是否合法的问题。
“NP” 代表 “nondeterministic polynomial time” 。
显然有 P ⊆ N P P\subseteq NP P⊆NP
归约
对于两个问题A和B,如果能够在多项式时间内对A的输入进行转化,使得解决B的算法能够得到A问题的输出,那么就称A可以归约为B。一个例子是A为求解形式为 a x = b ax=b ax=b的方程,而B为求解形式为 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0的方程。
NPC问题(NP完全问题,NP-Complete问题)
对于一个NP问题,如果所有的NP问题都可以归约为它,那么称之为NPC问题。
NPH问题(NP-Hard问题)
对于一个问题,如果所有的NP问题都可以归约为它,那么称之为NPH问题。
关于3-sat问题
3-sat问题
有若干个布尔型的变量(variable)。
定义文字(literal)为,一个variable(称为positive literal)或者它的取反(称为negative literal)。
定义子句(clause)为,若干个文字(可能是一个)的或。
定义3-sat问题为:给出一个布尔表达式,这个表达式由若干个子句的与构成,每个子句恰好为三个文字的或,问是否存在一种给变量赋值的方式,使得表达式的值为真。
3-sat问题相关的归约
(下面的例子来自维基百科)
表达式 l 1 ∨ l 2 ∨ l 3 ⋯ ∨ l n l_1 \vee l_2\vee l_3\cdots\vee l_n l1∨l2∨l3⋯∨ln可以归约为3-sat的形式:
( l 1 ∨ l 2 ∨ x 2 ) ∧ ( ¬ x 2 ∨ l 3 ∨ x 3 ) ∧ ( ¬ x 3 ∨ l 4 ∨ x 4 ) ∧ ⋯ ∧ ( ¬ x n − 3 ∨ l n − 2 ∨ x n − 2 ) ∧ ( ¬ x n − 2 ∨ l n − 1 ∨ l n ) (l_1 \vee l_2\vee \ x_2) \wedge \\ (\neg x_2 \vee l_3 \vee x_3) \wedge \\ (\neg x_3 \vee l_4 \vee x_4) \wedge \cdots \wedge \\ (\neg x_{n-3} \vee l_{n-2} \vee x_{n-2}) \wedge\\ (\neg x_{n-2} \vee l_{n-1} \vee l_n) (l1∨l2∨ x2)∧(¬x2∨l3∨x3)∧(¬x3∨l4∨x4)∧⋯∧(¬xn−3∨ln−2∨xn−2)∧(¬xn−2∨ln−1∨ln)
已经被证明的重要结论:任意一个NP问题都可以归约为一个3-sat问题。
所以,如果要证明一个问题是NPC问题,则只需要证明它是NP问题且可以由某一个已知为NPC的问题归约到它就可以了。
P=NP?
到目前为止还没有找到在多项式时间内求解NPC问题的算法,也无法将这个命题证明或者证伪。