点击量:4522P/NP问题是在理论信息学中计算复杂度理论领域里至今没有解决的问题,它也是克雷数学研究所七个千禧年大奖难题之一。学计算机的肯定会经常听到P和NP,但我相信很多人跟我一样对这个问题既熟悉又陌生,并不能真正地把他理解透彻,今天花点时间总结下吧。
什么是P问题?
能够在多项式时间内给出答案的问题被称为P问题,也就是说存在一个多项式时间复杂度内的算法解决该问题。这个很好理解,那为什么要是在多项式时间呢?因为只有在多项式时间内的复杂度才是计算机所能接受的,再大的复杂度(比如指数级,阶乘级别)即使有解也没有实际价值(计算量太大)。
什么是NP问题?
对有些问题而言,并不存在一个已知的多项式时间内的算法来解决问题,但是如果有人能够提供一个答案(不论对错),我们却能够很快地验证这个解是否正确,那么这些能够在多项式时间内验证一个解的问题被称为NP问题。通俗,不严谨的讲就是能在多项式时间内猜出解的问题。举个栗子:著名的子集合求和问题(subset sum problem),给定一个整数集合:{−2, −3, 15, 14, 7, −10} ,问:是否存在一个非空子集其所包含的元素之和为0?答案当然是存在,比如:子集{−2, −3, −10, 15}的和就为0。这个问题可以在多项式时间内验证答案,但是不能给出一个多项式时间内的算法来解决问题。别小看这个简单的问题,目前已知的算法只能穷举,复杂度是2的N次方。
对于NP问题有几点说明:
很明显,所有的P问题都是NP问题,因为如果一个问题能在多项式时间内被解决,那么他一定能在多项式时间内被验证。NP代表的是Nondeterministic Polynomial Time,非确定性多项式时间,并不是想当然的非P问题,这点很容易混淆。这里解释下为什么要命名为非确定性多项式时间,就是因为不确定这类问题能否在多项式时间内被解决(已知算法的复杂度并不是多项式时间)。可以简单理解为很容易验证答案,但是很难给出算法的问题。
P/NP问题
好了,如果你理解了P和NP的概念,那么P/NP问题就很好理解了。P/NP问题讨论的其实是,一个能在多项式时间内被验证答案的问题是否也能在多项式时间内被解决?如果P=NP,则表示一个能在多项式时间内被验证答案的问题也能在多项式时间内被解决。
NP完全问题(