理解P问题和NP问题

最简单的解释:
P:算起来很快的问题
NP:算起来不一定快,但对于任何答案我们都可以快速的验证这个答案对不对
NP-hard:比所有的NP问题都难的问题
NP-complete:满足两点:

  • 是NP hard的问题
  • 是NP问题

最简单的例子:

123,456,789,001是不是质数?对于这个问题,计算机科学家可以用现有算法快速得到答案——123,456,789,001不是质数。无论这个数字是否会变得越来越大,算法计算所需资源会一直在可控范围内,不会突破天际。这是P问题。

那么,新的问题产生了:它的质因子有哪些,除了1和本身,它还能被哪些数整除?通常情况下,我们认为它和上个问题拥有不同的“复杂度”。验证一个数是不是质数很简单,但找出它的所有质因子就很困难。目前,算法还不能在短时间内解决这个问题,除非我们已经有了成熟的量子计算机。这是NP问题,但不是P问题。

什么是P问题?

代表:多项式时间复杂性类(Polynomial time)

简介:所有P问题都能被经典计算机(非量子计算机)轻松解决。

详细说明:如果一个问题是P问题,那么它必须满足在多项式时间内验证一个算法问题的实例是否有解 ,其中n是输入长度,c是个常数。

典型问题:

  • 这个数是否是个质数?
  • 两点之间的最短路径是什么?

研究热点:**P=NP是否成立?**如果成立,它将颠覆计算机科学,并使大多密码学内容在一夜之间失效(当然大多数人还是认为P!=NP)。

什么是NP问题?

代表:非定常多项式时间复杂性类(Nondeterministic Polynomial time)

简介:如果给出了一个解,所有NP问题都能被经典计算机快速验证。

详细说明:如果一个问题有一个解,且能在多项式时间内证明这是个正解,那么这就是个NP问题。

典型问题:

  • 分团问题。想象一个带边和点的图形,我们把它当成Facebook的社交网络,一个节点代表一个用户,如果两个用户是朋友关系,那么两个节点通过边连接。一个clique表示整个社交网络中的一个子集,其中所有人都是彼此的朋友。那么也许有人会问:这个社交网络中是否存在20人的clique?50人?100人?找到这样一个clique就是个“NP-完全问题”(NPC),这意味着它具有NP中任何问题的最高复杂度。但是,如果问题是50个节点可不可以形成一个小子集,它给出了潜在答案,那么这个NP问题就很容易被验证。
  • 旅行商问题。有许多城市,每个城市之间都有对应的路程距离,旅行商能不能在不到具体里程数的情况下经过所有城市。

之所以要定义NP问题,是因为通常只有NP问题才可能找到多项式的算法。我们不会指望一个连多项式地验证一个解都不行的问题存在一个解决它的多项式级的算法。相信读者很快明白,信息学中的号称最困难的问题——“NP问题”,实际上是在探讨NP问题与P类问题的关系。

很显然,所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。关键是,人们想知道,是否所有的NP问题都是P类问题。我们可以再用集合的观点来说明。如果把所有P类问题归为一个集合P中,把所有 NP问题划进另一个集合NP中,那么,显然有P属于NP。现在,所有对NP问题的研究都集中在一个问题上,即究竟是否有P=NP?通常所谓的“NP问题”,其实就一句话:证明或推翻P=NP。

什么是NPC?

规约的概念:

“A 推导出 B” 等价于 “B可以规约为A”。规约相当于更加抽象化的一个过程。规约具有传递性。如果问题A可约化为问题B,问题B可约化为问题C,则问题A一定可约化为问题C。

NPC问题的定义非常简单。同时满足下面两个条件的问题就是NPC问题。

  • 是一个NP问题

  • 所有的NP问题都可以规约到它。

证明一个问题是 NPC问题也很简单。先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它(由约化的传递性,则NPC问题定义的第二条也得以满足;至于第一个NPC问题是怎么来的,下文将介绍),这样就可以说它是NPC问题了。

“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。

什么是NP-Hard问题?

NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广)。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。

NPC问题实例

逻辑电路问题是第一个NPC问题。其它的NPC问题都是由这个问题约化而来的。因此,逻辑电路问题是NPC类问题的“鼻祖”。

逻辑电路问题是指的这样一个问题:给定一个逻辑电路,问是否存在一种输入使输出为True。

逻辑电路问题属于NPC问题。这是有严格证明的。它显然属于NP问题,并且可以直接证明所有的NP问题都可以约化到它(不要以为NP问题有无穷多个将给证明造成不可逾越的困难)。证明过程相当复杂,其大概意思是说任意一个NP问题的输入和输出都可以转换成逻辑电路的输入和输出(想想计算机内部也不过是一些 0和1的运算),因此对于一个NP问题来说,问题转化为了求出满足结果为True的一个输入(即一个可行解)。

有了第一个NPC问题后,一大堆NPC问题就出现了,因为再证明一个新的NPC问题只需要将一个已知的NPC问题约化到它就行了。后来,Hamilton 回路成了NPC问题,TSP问题也成了NPC问题。现在被证明是NPC问题的有很多,任何一个找到了多项式算法的话所有的NP问题都可以完美解决了。因此说,正是因为NPC问题的存在,P=NP变得难以置信。P=NP问题还有许多有趣的东西,有待大家自己进一步的挖掘。

[外链图片转存失败(img-tgSp8PX3-1565712766517)(assets/1565701234498.png)]

参考资料:

https://zhuanlan.zhihu.com/p/43412945

https://zhuanlan.zhihu.com/p/22497908

发布了205 篇原创文章 · 获赞 655 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/qq_33414271/article/details/99496635
今日推荐