浅谈P vs. NP

285 阅读6分钟

P vs. NP( Non-Deterministic Polynomial) 是一个遗留未解决的计算机科学的重要问题,也是算法领域的重要问题。下面分成几个部分为大家介绍这个问题:

  1. 算法和算法复杂度-(研究不同复杂度的意义)
  2. NP问题-算法问题类型
  3. P vs. NP问题
  4. NPC是什么
  5. 如果P=NP

什么是算法?

算法就是一系列描述好的计算过程。比如曹冲称象:

曹冲称象
步骤1: 置象大船之上
步骤2: 刻其水痕所至
步骤3:称物以载之
步骤4:校可知矣

有了计算机后,算法本质没有变化,我们将计算步骤编码,变成了计算机程序执行的序列。

时间复杂度

算法构成了计算机解决问题的基本单元,每个算法的执行都需要时间和空间。通常的,输入规模越大,往往需要的时间和空间越多。比如要统计一个电商网站的流量,数据量越大,需要的时间越多。

考虑到运算时间会受到计算机硬件、操作系统、当时机器运行状态的影响,于是我们衡量算法好坏的时候,需要规避这些影响。

我们发现,虽然算法在不同媒介执行的时间不同,但是输入规模和时间的增长关系总是很定不变的。如果输入规模用N表示,那么时间T和N的关系,我们通常用曲线表示。

如果某个算法规模-时间曲线,是一条直线直线。虽然直线的斜率受到CPU速度、硬件架构等等各种因素影响,但是经过实验取样分析,这种线性关系总是保持恒定不变。于是我们说,这个算法时间复杂度是O(n)。

对于其他时间-规模曲线,也会有同样的特征,于是我们就有了算法复杂度的分类,比如 [公式] , [公式] 的算法。

[公式] 复杂度

考虑一个 [公式] 的算法,规模稍微增加一点点,时间都会增加非常多。比如当n=1的时候,时间和数字1相关,但是当n=10的时候,10^100是一个非常恐怖的量级。尽管如此,在第一台计算机ENIAC被发明之后,我们很长一段时间认为,这样的算法,终会被人类战胜。

ENAIC这种长30米,宽6米的庞然大物,每秒只可以执行5000次加法和400次乘法

为什么会这样呢?因为我们的计算能力发展太快了。那时人们对于解决[公式]算法还是充满信念的。著名的思潮有intel的创始人摩尔提出的摩尔定律。就是当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。

在摩尔定律预言下的这些年

第一台计算机ENIAC每秒只能计算400次乘法,如今的好点的计算机每秒计算千万次乘法轻轻松松。如果按照这个速度增长上去,我们最终将克服各种缓慢的算法。但是到了2011年左右,这种增长势头就开始放缓了。原因是集成电路上可容纳的电子元件,因为散热等问题也达到了一个瓶颈。

但是我们仍然坚信[公式]在某天是可解的,比如我们可以用分布式集群,我们还有量子计算机。

冷静

但随着算法的发展,很快我们发现有很多问题复杂度是[公式]的。

因为规模-时间增长太快,我们是没有信心去解决的。 因为时间增长的速度,远远超过了我们计算能力增长的速度。

另一方面,我们发现还有很多问题是无论给我们多少时间,多少空间都无法解决的——比如宕机问题。

P vs. NP

P vs. NP 是一个非常重要的,未被解决的计算机问题。2000年,克雷顿数学研究所,发布了7个数学难题(Millennium Prize Problems),每个奖励100万美金,其中就有P vs NP问题。

P代表多项式时间。我们发现现实生活中有一类问题,可以在多项式时间(比如 [公式] ,[公式] 等等)内被验证。虽然可以在多项式时间被验证,但是往往不容易解决, 我们将这类问题归类成NP问题。 所以NP问题,本质上是一类在我们可以接受的时间范围内可以被验证的问题

比如说数独问题,验证很容易,只要遍历行和列去检查就可以了是一个O(n^2)的算法,但是求解很困难。尤其是很大的数独,比如1000*1000的数独。

再比如说,求地图上两点的最短路径,我们可以轻松的在多项式时间内解决。

但是这些可以被计算机验证的问题,可以被计算机解决吗?  于是我们得到一个疑问:数独问题也可以在多项式时间内解决吗? 如果可以,那么P=NP;如果不可以,那么 [公式]

究竟P=NP还是 [公式] 呢? 这就是P vs NP问题。 这个问题我们不知道答案,如果谁发现了答案,那么可以得到100万美金的奖励。

NPC

在所有的NP问题中,其中有一类问题非常相似,目前我们只找到了类似穷举的解法。著名的如零和子集问题:求一个整数(可以有负数)集合的零和子集。我们只有先枚举所有子集,再求解。再比如蛋白质折叠……也是类似的问题。

我们发现蛋白质折叠和零和子集问题,其实本质上是相似的同一个问题。 于是我们将他们先归为一个临时的类别,叫做NPC(NP Complete)。

如果P=NP,那么所有的NPC问题都可以在多项式时间内解决,只是目前我们还没有找到解法。如果[公式],那么所有的 NPC问题应该单成一类,从P中划分出去。 下面的维恩图表示了这两种情况:

如果P=NP

最后,我们来展望下,如果P=NP。

如果,NP问题可以在多项式时间内被验证,同时被解决(N=NP)。也就是说,当我们提出一个问题的验证方法后,我们就获得了这个问题的解。那么能不能解决问题,就变成了能不能提出问题。

  • 因为计算机可以验证数独,那么计算机可以求解数独,即便是10000*10000的数独。
  • 因为计算机可以验证很多数学公式产生的结论是否正确,那么计算机可以获得推导过程,大量数学公式不再需要证明。(数学家失业)
  • 计算机利用和谐理论判断音乐是否好听,那么计算机可以创造好听的音乐。
  • 验证基因序列=改善基因
  • 很容易计算蛋白质折叠的方式(治愈癌症重大突破)
  • 公钥体系失效(枚举密码轻而易举) 本文链接:zhuanlan.zhihu.com/p/43806136 如有侵权,联系删除