NP-Hard问题与NP问题关系详解

1,397 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

时间复杂度

对于时间复杂度大家并不陌生,我们看看多项式是什么。 多项式(polynomial)的一般表达为:a0+a1x+a2x2+...+akxka_0+a_1x+a_2x^2+...+a_kx^k,例如常见的2次多项式:5x2+3x+85x^2+3x+8

求解输入规模为n的问题,在最坏的情况下的求解时间为O(nk)O(n^k),其中k为某个常数,则该算法为多项式时间的算法。

多项式时间是当今计算科学里,问题“可解”与“不可解”的分水岭。实际上,当指数系数 kk 很大时,求最优解也会很困难,但无论如何理论上是可行的。

比多项式时间更可怕的是指数时间O(kn)O(k^n),这相当于调换了一下,但是难度陡然上升。就算k是最小的2,也就是O(2n)O(2^n),那也不得了。随着输入规模n的缓慢增加,例如1到100,其计算量指数增加,将会导致指数爆炸。

当然,指数时间还不是最可怕的。如果问题复杂可能会出现阶乘时间O(n!)O(n!),这是目前计算机的算力无法承受的计算量。给大家列个表:

时间复杂度级别
O(1)O(1)常数级
O(n)O(n)线性级
O(n2)O(n^2)平方级
O(an)O(a^n)指数级
O(n!)O(n!)阶乘级

P问题

P问题(这里的P代表Polynomial):指一个问题可以找到一个能在多项式的时间里解决它的算法。即问题可以在多项式时间内求解。P类问题就是所有复杂度为多项式时间的问题的集合。

确定一个问题是否是多项式问题,在计算机科学中非常重要。已经证明,多项式问题是可解问题,因为除了P问题之外的问题,其时间复杂度都很高,即求解需要大量时间。

理论上有解但其时间复杂度巨大的问题,科学家将其称为难解型问题。对计算机来说,这类问题是不可解的。因此,P问题成了区别问题是否可以被计算机求解的一个重要标志。

NP问题

NP代指Nondeterministic Polynomially(非确定性多项式)。NP问题指:一个问题不能确定是否在多项式时间内可以求解,但是可以在多项式时间内验证答案是否正确。

注意:NP问题是不知道该问题是否存在一个多项式时间的算法。是不知道,而非不存在。也就是说NP问题,可能存在多项式时间的求解方法,只是目前还没找到(也可能不存在,但目前也无法证明它不存在)。

NPC问题

NPC(NP Complete,NP完全)问题是一类特殊的NP问题。先说下约化的概念:

问题A可以约化为问题B的含义是:可以用问题B的解法解决问题A,或者说,问题A可以“转变成”问题B。

NPC问题的定义非常简单。第一,它是一个NP问题;第二,所有的NP问题都可以约化到它。同时满足这两个条件的问题就是NPC问题。

NPC问题有一个令人惊讶的性质,即如果一个NPC问题存在多项式时间算法,那么所有NP问题都可以在多项式时间内求解,即P=NP成立。这是因为每一个NPC问题都可以在多项式时间内转化成任何一个NP问题。只要任意一个NPC问题找到了一个多项式算法,那么所有NP问题都能用这个算法解决,也就解决了NP=P问题。

NP难问题

NP Hard问题定义也很简单:满足NPC问题定义的第二条但不一定满足第一条。即所有的NP问题都能在多项式时间约化到它,但是它不一定是一个NP问题。范围如下:

image.png

NPC 和 NP-hard 的主要区别在于:验证一个问题A是否为NP-hard问题,无需判断A是否属于NP问题

也就是说NP-hard问题可能是这样一个问题:该问题不确定是否存在多项式时间的求解算法,也不确定是否能在多项式时间内验证它的一个解。换句话说,你出了一个问题A,让我设计一个多项式时间的求解算法。我设计不出来。然后你扔给我一个答案,说这是这个问题的解。我也无法在多项式时间内验证这个答案究竟是不是它的解。

上图其实不是很准确,NP hard应该是包含了NP。