转载之:http://zhiqiang.org/blog/
具体研究:
这个问题,作为理论计算机科学的核心问题,其声名早已经超越了这个领域。它是Clay研究所的七个百万美元大奖问题之一,在2006国际数学家大会上,它是某个1小时讲座的主题。
要说起P和NP是什么东西,得先从算法的多项式时间复杂度谈起,注意,这里面的两个P都是指Polynomial。
一个问题的规模指的是输入的总位数,比如一个n个数的排序问题,输入规模就是n。注意,在某些时候,输入规模是要值得注意的,比如判定一个数n是否是一个质数这个问题,它的输入规模并不是n,而是log(n),因为一个数n用大约log(n)位就能表示出来了,这也是为何枚举因子判定素数的算法并不是多项式时间算法的原因。
如果一个算法,它能在以输入规模为参变量的某个多项式的时间内给出答案,则称它为多项式时间算法。注意:这里的多项式时间是指算法运行的步数。一个算法是否是多项式算法,与计算模型的具体的物理实现没有关系,虽然大多数假想的计算模型不可能有任何物理的实现。
P指确定型图灵机上的具有多项式算法的问题集合,NP指非确定型图灵机上具有多项式算法的问题集合,这里N是Non-Deterministic的意思(图灵机的概念见理论计算机初步:算法和计算模型)。
脱离图灵机的概念,就在普通的计算机上看,P问题是指能够在多项式时间求解的判定问题(判定问题指只需要回答是和不是的问题),而NP问题则是指那些其肯定解能够在给定正确信息下在多项式时间内验证的判定问题。比如,要判定一个数是合数,如果给我一个约数,我们就很快判定它就是合数。所以判定一个数是合数的问题属于NP。 下面是一些NP问题的例子:
从上面的定义知道,NP包含P。P vs NP问题指P是否完全等于NP,即确定型图灵机和非确定图灵机的性能是否一样。
人们为何要提出NP问题?因为,大多数遇到的自然的难解问题,最后都发现它们是NP问题。如果我们能证明NP跟P的关系,则解决了无数问题的算法复杂度问题。
NP里面有无数个不同的问题,我们是否要一个一个地判定它们是否属于P呢?P vs NP问题的美妙和简洁之处便在于在NP中,有一个子类,NP完全(NP Complete,简记为NPC)问题,指的是那些NP中最难的那些问题:所有其它的NP问题都可以归约到这些NP完全问题。也就是说,只要这些NP完全问题的某一个得到解决,无论是证明其存在多项式算法,还是不存在,都意味着P vs NP问题的解决。
而几乎所有NP里面无法确定是否属于P的问题最后都被证明为NP完全。正因为如此,多数理论计算机学家都猜测P≠NP。目前已知的NP完全问题数以千计,上面引用中的例子都是完全问题,更多NP完全问题见NP完全问题的不完全列表。
一个很自然的想法是如果NP≠P,则NP-P里面的问题都是完全问题。至少有两个自然的问题,一个是大数分解(给出一个数的质因数分解式),另一个是图同构问题(给出两个图,它们是否同构),它们既没有被证明是P的,也没有被证明是NP-完全。但是更惊人的是还有这个定理:
当然,这种问题具体是什么样子,是无法用直观的语言表示出来,它纯粹是一个数学上的构造性证明。
已经提到了显示中大多数难解问题问题最后都被证明是NP-完全问题。这意味着,除非NP=P,它们是不可能有多项式时间算法的(而且,即使NP=P,人们也可能找不到一个NP完全问题的「有效」算法)。
所以人们发展了各种工具来避开它们,最常用的两种方法是使用概率算法和近似算法,这两种方法也符合实际需要:在解决实际问题中,我们不需要结果绝对正确,也不需要结果绝对精确。
所谓概率算法,就是在算法的过程中引入随机数,使得算法在执行的过程中随机选择下一个计算步骤。它最后可能导致结果也是不确定的。一个结果不确定的概率算法叫做Monte Carlo算法,而总是得到准确解的概率算法叫做Sherwood算法(一个例子是引进随机因子的快速排序算法)。
为何引入随机数能够提升计算性能(事实上,理论计算机学家还没能证实随机因子本质上更有效率——指具有指数级别的效率提升),主要有下面两个原因:
首先,通常一个算法,它对于很多种情况是比较快的,但对于某些「特别差」的输入,它要找到一个解则特别困难。引入随机数之后,使得算法的时间复杂度平均化了,然后算得更快(评价一个随机算法的复杂性通常是考虑其平均复杂性)。
其次,对于Monte Carlo算法,它的输出是不精确的,这种牺牲使得算法能够在较短时间内完成。
需要指出的是,下面这个定理,使得一个不那么精确的Monte Carlo算法亦有实际的效用的:
上面的结果由于k出现在指数上,所以只需要将一个Monte Carle算法重复很少的次数,便能得到很高的准确率。
近似算法从字面的意思来看似乎和上面的Monte Carle算法差不多,其实它们的考虑对象是不一样的,而且通常所指的近似算法是确定型算法。近似算法多用在组合优化的问题,而不是判定性问题上。组合优化问题,指的是那些需要求最优解的问题,比如下面这个
对于这种问题,如果最短路径是1000,而且我们能很快找到一个1000.1的路径,在实际运用中,我们还需要浪费巨大的计算资源去找那个1000的路径吗?近似算法便基于此思想而来。
近似算法指在解决优化问题中,最后得到的结果能保证在一定的误差之内的算法。
从近似算法的角度来说,同为NP完全问题,它们也有不同的可近似度。在多项式时间内,有些问题可以无穷小误差的逼近,但有些问题却连常数倍数之内的结果都没法得到。
参阅: