何为 NP-hard

NP-hard 问题

NP-hard problem, NP(Non-deterministic Polynomial)

一、 预备知识

1. 时间复杂度

表明问题规模扩大后,程序需要的时间长度增长得有多快
程序的时间复杂度一般可以分为两种级别:

  • 多项式级的复杂度:如 O ( 1 ) \text{O}(1) O(1) O ( log  n ) \text{O}(\text{log} \ n) O(log n) O ( n a ) \text{O}(n^a) Ona 等,
  • 非多项式级的:如 O ( a n ) \text{O}(a^n) O(an) O ( n ! ) \text{O}(n!) O(n!) 等。后者的复杂度计算机往往不能承受。

定义: 存在常数 c c c,使得当 k > = c k >= c k>=c T ( k ) < = f ( k ) T(k) <= f(k) T(k)<=f(k),表示为 T ( n ) = O ( f ( n ) ) T(n) = \text{O}(f(n)) T(n)=O(f(n))

何为 NP-hard_第1张图片

n n n 趋近于无穷大时,如果 l i m T ( n ) f ( n ) lim \frac{T(n)}{f(n)} limf(n)T(n) 的值为不等于 0 的常数,则称 f ( n ) f(n) f(n) T ( n ) T(n) T(n) 的同数量级函数。记作 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))

  • 简单说 O ( n 2 ) \text{O}(n^2) O(n2) 表示当 n n n 很大的时候,复杂度约等于 C n 2 Cn^2 Cn2 C C C 是某个常数,简单说就是当 n n n 足够大的时候, n n n 线性增长,复杂度将沿平方增长。
  • O(n) \text{O(n)} O(n) 也是差不多的意思,也就是说 n n n 很大的时候复杂度约等于 C n Cn Cn C C C 是某个常数。
  • O(1) \text{O(1)} O(1) 就是说 n n n 很大的时候,复杂度基本就不增长了,基本就是个常量 C C 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 n,问题都可以在 n 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 问题,即算法的时间复杂度是多项式级的。比如 n n n 个数中间找到最大值,或者 n n n 个数排序之类的。

2. NP Problem

NP 问题的另一个定义是可以在多项式的时间里猜到一个解的问题,例如求图中起点到终点是否有一条小于100个单位长度的路线,随便选一条,如果算出来路径小于100,那么就猜到了一个解,也就是说如果你运气足够好的话就可以在多项式时间内解决这个问题。当然猜的前提是问题存在解。

很显然,所有的 P 类问题都是 NP 问题,能在多项式时间内解决,必然能多项式地验证一个解。(NP 是否等于 P 这个问题貌似还没有定论。)

著名的NP类问题:旅行家推销问题(TSP)
有一个推销员,要到 n n n 个城市推销商品,他要找出一个包含所有 n n n 个城市的环路,这个环路路径小于 a a a。我们知道这个问题如果单纯的用枚举法来列举的话会有 ( n − 1 ) ! (n-1)! (n1)! 种,已经不是多项式时间的算法了(注:阶乘算法比多项式的复杂)。那怎么办呢?我们可以用猜的,假设我人品好,猜几次就猜中了一条小于长度 a a a 的路径,好的,我得到了一条路径小于 a a a 的环路,问题解决了,皆大欢喜。可是,我不可能每次都猜的那么准,也许我要猜完所有种呢?所以我们说,这是一个 NP 类问题

所以这就引出了这类讨论的一个千年问题:是否 NP类问题=P类问题?即是否所有能在多项式时间内验证得出正确解的问题,都是具有多项式时间算法的问题呢? 要是解决了这个问题,那岂不是所有的NP问题都可以通过计算机来解决。

3. NPC Problem:

存在一个NP问题,使得所有的该类NP问题都可以多项式时间地规约(Polynomial-time Reducibility) 为NPC问题。根据规约的传递性,对NP问题进行一层接一层地规约,最终可以得到一个足够泛化的NP问题,即NPC问题。

何为 NP-hard_第2张图片

References

  • https://hujichn.github.io/2016/07/14/什么是P、NP、NPC、NP-Hard问题/

你可能感兴趣的:(理论和算法)