NP-hard 问题
NP-hard problem, NP(Non-deterministic Polynomial)
一、 预备知识
1. 时间复杂度
表明问题规模扩大后,程序需要的时间长度增长得有多快。
程序的时间复杂度一般可以分为两种级别:
- 多项式级的复杂度:如
O(1) ,O(log n) 、O(na) 等,- 非多项式级的:如
O(an) 、O(n!) 等。后者的复杂度计算机往往不能承受。
定义: 存在常数
当
- 简单说
O(n2) 表示当n 很大的时候,复杂度约等于Cn2 ,C 是某个常数,简单说就是当n 足够大的时候,n 线性增长,复杂度将沿平方增长。O(n) 也是差不多的意思,也就是说n 很大的时候复杂度约等于Cn ,C 是某个常数。O(1) 就是说n 很大的时候,复杂度基本就不增长了,基本就是个常量C 。
2. 约化 (Reducibility)
一个问题 A 可以约化为问题 B 的含义是,可以用问题B的解法解决问题A。(个人感觉是说,问题 A 是 B 的一种特殊情况。)标准化的定义是,如果能找到一个变化法则,对任意一个 A 程序的输入,都能按照这个法则变换成 B 程序的输入,使两程序的输出相同,那么问题 A 可以约化为问题 B 。
例如求解一元一次方程这个问题可以约化为求解一元二次方程,即可以令对应项系数不变,二次项的系数为0,将A的问题的输入参数带入到B问题的求解程序去求解。 另外,约化还具有传递性,A 可以化约为 B,B 可以约化为 C,那么 A 也可以约化为 C。
二、 基础概念
- P Problem: 对于任意的输入规模
n ,问题都可以在n 的多项式时间内得到解决; - NP(Non-deterministic Polynomial) Problem: 可以在多项式的时间里验证一个解的问题;
- NPC(Non-deterministic Polynomial Complete) Problem: 满足两个条件:
- 是一个 NP 问题
- 所有的 NP 问题都可以约化到它
- NP-hard Problem: 满足NPC问题的第 2 条,但不一定要满足第 1 条。(NP-Hard问题要比 NPC问题的范围广)
1. P Problem
如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于 P 问题,即算法的时间复杂度是多项式级的。比如
2. NP Problem
NP 问题的另一个定义是可以在多项式的时间里猜到一个解的问题,例如求图中起点到终点是否有一条小于100个单位长度的路线,随便选一条,如果算出来路径小于100,那么就猜到了一个解,也就是说如果你运气足够好的话就可以在多项式时间内解决这个问题。当然猜的前提是问题存在解。
很显然,所有的 P 类问题都是 NP 问题,能在多项式时间内解决,必然能多项式地验证一个解。(NP 是否等于 P 这个问题貌似还没有定论。)
著名的NP类问题:旅行家推销问题(TSP)。
有一个推销员,要到
所以这就引出了这类讨论的一个千年问题:是否 NP类问题=P类问题?即是否所有能在多项式时间内验证得出正确解的问题,都是具有多项式时间算法的问题呢? 要是解决了这个问题,那岂不是所有的NP问题都可以通过计算机来解决。
3. NPC Problem:
存在一个NP问题,使得所有的该类NP问题都可以多项式时间地规约(Polynomial-time Reducibility) 为NPC问题。根据规约的传递性,对NP问题进行一层接一层地规约,最终可以得到一个足够泛化的NP问题,即NPC问题。