这篇文章中我来简单谈谈NP完全性。不同于前面所有文章中的各个具体的问题和算法,NP完全性是一个很抽象的大概念,其包括但不仅限于标题中提到的P问题、NP问题、NPC问题和NP难问题。这里我简单谈谈我对书上的内容和一些例子的理解。
P问题
首先来谈谈P问题。算法导论随笔系列写到现在,已经介绍了很多问题及它们的算法。其中大部分的问题,都是P问题。那么什么是P问题呢?P问题指的是能在多项式时间内解决的问题。这里的P是Polynomial(即多项式)的缩写。初中数学告诉我们,一个多项式有如下的形式:

其中a0,a1,… an为常数,n为常数。
也就是说,对于一个解决P问题的算法,其时间复杂度应该符合上述形式。比如冒泡排序的复杂度为
T(n) = O(n2)
这里的n2就是一个关于n的多项式。像冒泡排序这样复杂度可以表示为多项式的算法,就是多项式时间算法。如果一个问题能用多项式时间算法解决,那么这个问题就是P问题。书中的叙述也印证了我们的想法:
The class P consists of those problems that are solvable in polynomial time. More specifically, they are problems that can be solved in time O(nk) for some constant k, where n is the size of the input to the problem.
并不是所有的算法都是多项式时间的。比如一个算法的复杂度为O(2n),那么这个算法就不是多项式时间算法,因为多项式的形式中,每一项的指数应该是一个常数,而这里的指数为n,是一个变量,因此2n并不是一个关于n的多项式,也就是说复杂度为O(2n)的算法并不是多项式时间算法。再比如复杂度为O(n!),或复杂度为O(nn)的算法都不是多项式时间算法。
NP问题
下面来谈谈NP问题。先来看下面的一个问题:假设我们有一个如下图所示的Graph,其中每一个顶点代表一个城市,每条边上面的数字代表了两个城市之间的距离。现在有一个快递员要给图中所有的城市送快递,问什么路径可以访问所有的城市,并且快递员行走的距离之和最短。

这就是著名的旅行商问题。旅行商问题不是P问题,因为人们没办法找到一个多项式时间的算法来解决它。那么这个问题是不是NP问题呢?答案是不是。很多人觉得P问题的集合和和NP问题的集合互为补集,即一个问题若不是P问题,则它就是NP问题。这是一个误区,在后面会介绍。
既然旅

本文深入探讨了算法导论中的NP完全性概念,涉及P问题、NP问题、NPC问题和NP难问题。P问题是能在多项式时间内解决的问题,而NP问题能在多项式时间内验证解。NPC问题是一类特别的NP问题,如果找到其多项式时间解法,就能解决所有NP问题,证明P=NP。NP难问题则是即使验证解也需要超过多项式时间的问题。

1万+

被折叠的 条评论
为什么被折叠?



