计算机求解问题中有两类基础的问题:判定问题和优化问题。
判定问题是那些回答“是”或“否”的问题;
优化问题通常有一个目标函数,问题的解的值是此目标函数的最优值。
很多优化问题可以归结为一系列的判定问题。
比如我们以团问题为例:
它是一个最优化问题——我们想要求解一个图中最大的团,大小为k;
转换为判定问题可以是:
是否存在一个大小为1的团?
是否存在一个大小为2的团?
……
是否存在一个大小为k的团?
……
是否存在一个大小为|V|的团?
因此,判定问题是最基础的一个问题。P和NP都是判定问题的集合。
在讨论计算复杂性类时,“语言”和“问题”两个概念可以互换使用。
P类是多项式时间内可解的判定问题的集合。
图是否连通、判断一个数是否为素数均为P类问题。
NP类是可在多项式时间内用不确定算法求解的判定问题
也可以说是能在多项式时间内可验证的判定问题。
P类问题NP类问题
但P是不是NP的真子集,或者说P是否能=NP就不得而知了。
大部分人认为P不等于NP。
约化:
满足两个特征,我们可以说Q1能够约化至Q2:
1.实例对应:Q1的任意一个实例,都能找到Q2中的一个实例与之对应,并且能够在多项式时间内转换为Q2中的实例
2.输出一致:Q1实例的解=对应的Q2实例的解
Q1,Q2为两个问题,若Q1能够约化至Q2,那么只要Q2存在多项式算法,Q1就能在多项式时间求解。
Q2难于Q1。
比如一元二次方程可以约化为二元二次方程x^2+x=6可以约化为x^2+x+xy=6,只需要y=0.
如何证明Q1能够归约至Q2?
1.Q1实例能够转换为Q2实例
2.转换可以在多项式时间完成
3.Q1实例解=>Q2实例解
4.Q1实例解<=Q2实例解
NPC问题
满足:
1.是NP问题
2.所有NP问题都能约化至它
可以简单理解成NP类问题中最难解决的问题。且它是一类问题。
如何证明一个问题是NPC问题?
我们当然可以通过定义来证明:
1.首先证明它是个NP问题——可在多项式时间内验证
2.接着证明任意NP问题都能约化至它。
很显然,第二步并不简单。
因此,我们常常通过下面这种方法来证明:
1.首先证明它是个NP问题
2.证明一个已知的NPC问题能够约化至它
这个证明方法显然是正确的:NP类问题一个已知的NPC问题该问题,而该问题本身又属于NP问题。
NP-Hard
满足:任意NP类问题,都能约化至它
它是一类比NP问题都难的问题。
相较于NPC问题而言,少了一个限定条件。
因此NPC问题包含于NP-Hard问题。
这样,我们可以给出NPC问题的另一种定义方式:即是NP问题,又是NP-Hard问题的一类判定问题的集合。
P & NP & NPC & NP-Hard
在认为PNP的条件下,四者的关系为