P类问题:所有在多项式时间内可解的问题
另外一类问题,是判定问题,而且在多项式时间内可验证。首先,什么是判定问题?判定问题即是yes or no 问题。给定实例集 D D D, 以及其中一个子集 Y Y Y,该子集内的实例解为yes,其余为no。例如在无向图上判断是否有哈密顿回路。实例集即为全体无向图,yes子集即为全体哈密顿图。
NP类问题:所有多项式时间可验证的判定问题。 即给定一个问题实例,给定任意猜想t,可以在多项式时间内判断t是否能证明该实例属于支持集。
NP难:所有的NP问题都可以多项式时间变换到该问题上,则该问题是NP难的。
什么是多项式时间变换?两个问题 < D 1 , Y 1 > , < D 2 , Y 2 > <D_1, Y_1>, <D_2, Y_2> <D1,Y1>,<D2,Y2>,如果问题1的一个实例 I 1 I_1 I1 是有解的,那么存在一个多项式可计算的变换 f f f, I 2 = f ( I 1 ) I_2 = f(I_1) I2=f(I1) 是问题2的一个有解的实例。
具体来说,为了研究第二个问题的复杂性,如果已知第一个问题的下界;那么由于第一个问题可以归约到第二个问题上,那就可以利用第二个问题的算法解决第一个问题,所以第二个问题复杂性不低于第一个问题。
NP完全:如果一个问题既是NP问题,又是NP难问题,则称为是NP完全问题。
所有的P问题都是NP问题,而P是否等于NP是没有解决的问题。如果存在NP难的问题是P问题,那么P=NP
问题可以转化成P问题,那么本身也是P问题。难解问题(P问题之外的问题)也只能转化成难解问题。
问题可以由一个NP难的问题转化过去,那么也是NP难问题。
问题是NP问题,可以由一个NP完全问题转化过去,那么也是NP完全问题。
一些简单例子
- 哈密顿回路(HC,NP问题):给定无向图,是否存在哈密顿回路?
- 旅行商问题(TSP,NP问题):给定n个城市及两两之间的有向距离 d ( i , j ) d(i, j) d(i,j)。寻找恰好经过每个城市一次且总距离最小的路径。这种组合优化问题,等价于给问题多一个参数,即是否存在不超过总和 V V V 的路径。
- 0-1背包问题:也是NP问题
TSP问题可以由HC问题多项式时间转换过去。对于一个哈密顿图,让他所含的边对应的距离为1,补图的边对应的距离为2。所得到的TSP问题实例参数即为回路中的边数。
- 最小生成树:是否有权不超过 B B B 的生成树。最大生成树:是否有权不小于 D D D 的生成树。
最小生成树可以由最大生成树转化得到: M M M 为全局边权的最大值。使 B = ( n − 1 ) M − D B = (n - 1)M - D B=(n−1)M−D,再将所有边权 e e e 改为 M − e M - e M−e。那么原先的生成树就支持新的对应的问题实例有解。
尽管还没有证明P与NP的具体关系,但一般相信P与NP不相同。其中NP完全问题最有可能不是P问题。
NP-Complete
- Cook-Levin定理:SAT问题(合取范式的成真问题)
- 最大可满足性(Max-SAT):变元赋值使得给定的 m m m 个析取式中至少有 K K K 个为真。
- 三元可满足性(3SAT):给定一个3元合取范式F,F的可满足性。
- 顶点覆盖(VC):给定无向图以及 K K K,是否有顶点数不超过 K K K 的顶点覆盖
- 团:给定无向图以及 J J J,是否有顶点数不小于 J J J 的团。
- 独立性:给定无向图以及 J J J,是否有顶点数不小于 J J J 的独立集。
- 有向HC问题,HC问题,TSP问题
- 恰好覆盖:给定有穷集 A A A 以及子集的集合,是否存在若干子集恰好覆盖原集合
- 子集和:给定正整数集与 T T T,是否存在子集和为 T T T。
- 装箱:给定n件物品的重量,能否用 K K K 个容量为 B B B 的箱子容纳
- 双机调度:给定n项作业的时间,在两台相同机器上,能否在时间 D D D 内完成。
- 整数线性规划: A x ≥ b , x ≥ 0 Ax\geq b, x\geq 0 Ax≥b,x≥0 是否有解?