NP问题和计算复杂度

来源:互联网 发布:局域网问卷调查软件 编辑:程序博客网 时间:2024/06/01 19:09

最近看书,多次看到NP问题,就简单研究了下到底什么是NP问题。参考《数学之美》一书的附录


一、计算复杂度

我们知道,计算机中的算法复杂度,定义为只和问题规模N有关,即计算复杂度是N的一个函数 f(N)。

如果计算复杂度只相差一个常数因子,则认为复杂度是同一数量级的,是相同的,即 f(N) = Nlog(N) 和 g(N) = 100Nlog(N) 的复杂度是相同的。

所以我们干脆引进算子O()来描述算法复杂度。上述 f(N) 和 g(N) 均表示为 O(N logN)


二、P问题

如果像上面那样,求解一个问题的算法复杂度可以表示为多项式函数,那么这个问题就叫做P(Polynomial)问题,又叫多项式问题,这类问题被认为是计算机可以有效解决的。

否则,如果算法复杂度不可以用多项式表示,也就是说复杂度高到没有办法用多项式表示或者找不到有效的公式描述复杂度,那么就叫 Non-polynomial 的问题,即非多项式问题。


三、NP问题

很多问题并不是非黑即白的,要么有多项式复杂度的算法,要么没有。这些问题,我们无法确切地知道它的多项式复杂度的算法到底是否存在,所以叫做非确定的多项式(Nondeterministic Polynomial,简称 NP)问题。可以说,现实中的大多数问题都是这类问题。


四、分类

假设无论任何问题,我们都不确定地说它是具有多项式复杂度的,因为万事皆有可能,那么P问题就应该是NP问题的一个特殊的子集。而NP问题集合中不属于P问题的那部分,指的就是现在尚未找到多项式复杂度算法的问题。对于这类问题,是否能找到相应的多项式复杂度的算法,科学家们目前还有争议。如果能找到,那么NP=P;如果找不到,则P真包含于NP。

在NP问题中,有一类特殊问题叫做NPC(NP-Complete)问题,是NP中最难的一类问题。20世纪70年代,有科学家发现所有的NP问题都可以在多项式时间内归约到NPC问题,那么,如果任何一个NPC问题找到了多项式复杂度的算法,那么所有NP问题都可以用这个算法解决了,那么就有NP=P。

还有一个NP-Hard问题,指的是复杂度比NPC更大的一类问题。

各个问题的关系如下图所示,由于NP=P?的猜想目前没有定论,所以分两种情况作分类。


五、针对不同问题的算法设计

寻找一个问题的计算机算法,首先要找多项式复杂度的算法,并寻找这其中复杂度尽可能低的算法;其次,对于那些NP-Complete或者NP-Hard的问题,就设计可以找到近似解的算法即可。

0 0
原创粉丝点击