P vs. NP( Non-Deterministic Polynomial) 是一个遗留未解决的计算机科学的重要问题,也是算法领域的重要问题。下面分成几个部分为大家介绍这个问题:
- 算法和算法复杂度-(研究不同复杂度的意义)
- NP问题-算法问题类型
- P vs. NP问题
- NPC是什么
- 如果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 如有侵权,联系删除