【转】谈“P=NP?”
P=NP。我身边有一些非常聪明的人,他们基本也都不把这问题当回事。如果我对他们讲这些东西,恐怕是 TOO
OLD。可是我发现国内的计算机专业学生,提到这个问题总是奉为神圣,一点玩笑也开不得,所以我打算在这里科普一下。
为此,你必须先了解一下什么是“算法复杂度”。为此,你又必须先了解什么是“算法”。
是输入的大小。这个函数的值,通常是某种资源的需求量,比如时间或者空间。比如,如果你的算法时间复杂度为
n2,那么当输入10个东西的时候,它需要 100 个单元的时间才能完成计算。当输入 100 个东西的时候,它需要
10000 个单元的时间才能完成。当输入 1000 个数据的时候,它需要 1000000
个单元的时间。简单吧。
time”,多项式时间。简而言之,就是说这个复杂度函数 f(n)
是一个多项式。多项式你该知道是什么吧?不知道的话就翻一下中学数学课本。
时间之内,解决某个问题的算法”
n2)的时候,这就是“多项式时间算法”(P 时间算法)。当 f(n) 是个指数函数(比如
2n)的时候,这就是“指数时间算法”(EXPTIME 算法)。很多人认为 NP 问题就是需要指数时间的问题,而
NP 跟 EXPTIME,其实是风马牛不相及的。很显然,P 不等于 EXPTIME,但是 P 是否等于
NP,却没有一个结论。
NP。通常的计算机都是确定性(deterministic)的,它们在同一个时刻只能有一种行为。如果用程序来表示,那么它们遇到一个条件判断(分支)的时候,只能一次探索其中一条路径。比如:
one();
two();
这两个操作,只有一个会发生。
computer),它可以同时运行这程序的两个分支,one() 和 two()。这有什么用处呢?它的用处就在于,当你不知道 x
的大小的时候,根据 one() 和 two() 是否“运行成功”,你可以推断出 x 是否为零。
NP 的定义。
是这样两个“问题的集合”:
=
“确定性计算机”能够在“多项式时间”解决的所有问题
“非确定性计算机”能够在“多项式时间”解决的所有问题
这两个集合是否相等。为了证明两个集合(A 和 B)相等,一般都要证明两个方向:
P。因为任何一个非确定性机器,都能被当成一个确定性的机器来用。你只要不使用它的“超能力”,在每个分支点只探索一条路径就行。所以“P=NP?”问题的关键,就在于
P 是否也包含了
NP。也就是说,对于所有的非确定性多项式时间算法能解决的问题(NP),能否找到确定性的多项式时间算法。
time)。我们都知道,n2是多项式,n1000000也是多项式。多项式与多项式之间,却有天壤之别。把解决问题所需要的时间,用“多项式”这么笼统的概念来描述,其实是非常不准确的做法。在实际的大规模应用中,n2的算法都嫌慢。能找到“多项式时间”的算法,其实根本不能说明问题。
n1000000),也不能和再小的指数函数(比如
1.0001n)相比,因为总是“存在”一个 M,当 n > M
的时候,1.0001n会超过 n1000000。可是问题的关键,却不在于 M
的“存在”,而在于
它的“大小”。如果你的输入必须达到天文数字才能让指数函数超过多项式的话,那么还不如就用指数复杂度的算法。所以,“P=NP?”这问题的错误就在于,它并没有针对我们的实际需要,而是首先假设了我们有“无穷大”的输入,有“无穷多”的时间和耐心,可以让多项式时间的算法“最终”得到优势。“无穷”和“最终”,就是理论家们的杀手锏。
n1000000与 2n,并且解出它们相等时的 n。我不用
1.0001n来比,免得有人说我不公平。我喜欢偷懒,经常用 Mathematica
来解决这些算式。下面就是我用它得出的结果和曲线图:
< 24549200 的时候,我们都有 2n<
n1000000(n1000000那根曲线,一超过1就冲上天去了)。
所以只要输入没有达到2千万这个量级,2n的算法都比 n1000000的算法快。
n1000000也许不说明问题,但是“多项式”的范围实在太大了。n10100,n1010100,…… 都是多项式。实际上,只要 c
是个常数,任何常数,nc就是个多项式。
你能想象 n 需要多大,2n才能超过
n10100吗?当 n=2
的时候,n10100就是
210100。你也许已经意识到,这个数相当于 2n复杂度的算法,接受了 10100个输入。如果你知道
10100(1的后面跟100个0)已经大于宇宙中基本粒子的数目,你也许就会意识到,这是在计算宇宙里所有的粒子的“幂集”(power
set),也就是在枚举宇宙里所有粒子的所有组合。通俗一点说,就是在枚举宇宙里所有可能出现的物体。当任何超级电脑完成这个任务的时候,宇宙恐怕都已经不存在了。况且这个计算是根本无法完成的,因为即使每个粒子可以提供一次计数所需要的能量(E=MC2),你会在还没有数到
10100的时候就用光宇宙里所有的能量。最后,因为这两个 n 是同步的,所以当 2n的输入是 10100的时候,n10100等于
(10100)10100。所以即使枚举了宇宙里所有可能出现的物体,2n仍然远远落后于 n10100。
10100)就够了,因为常数也算是多项式。使用多项式的原因,只是想演示一下多项式可以有多大。
P=NP 被证明出来,我们仍然不会得到可以实用的结果。
3.65n2 + 21n +
1000,做出类似上面所示的曲线图,然后根据具体输入的大小,看看哪个算法更快一些。在这一点上,Knuth 在 TAOCP
中对算法的细致入微的分析,确实是值得借鉴的(虽然我不赞成他使用机器语言)。
P≠NP,那么人们就不用浪费时间去为 NP 问题寻找多项式时间算法了。推翻这一点本来已经没有多大意思,不过我发现一个挺有趣的观点,可以将这问题的正反两方面一并推翻。
“我们现有的计算机能否解决某种不存在的计算机能解决的所有问题?”
研究量子计算的博士生来求教职,给我们做了一个演讲,是关于量子计算机的“局限性”。他演讲的副标题叫做:
“What you cannot do with a computer that you do
not have?”
“你不能用你没有的机器做什么?”
没有聘用他。
【转】谈“P=NP?”的更多相关文章
- 浅谈P NP NPC
P问题:多项式时间内可以找到解的问题,这个解可以在多项式时间内验证. NP问题:有多项式时间内可以验证的解的问题,而并不能保证可以在多项式时间内找到这个解. 比如汉密尔顿回路,如果找到,在多项式时间内 ...
- 浅谈P/NP问题
克雷数学研究所(Clay Mathematics Institute,CMI)是在1998年由商人兰顿·克雷(Landon T. Clay)和哈佛大学数学家亚瑟·杰夫(Arthur Jaffe)创立, ...
- 浅谈分词算法(5)基于字的分词方法(bi-LSTM)
目录 前言 目录 循环神经网络 基于LSTM的分词 Embedding 数据预处理 模型 如何添加用户词典 前言 很早便规划的浅谈分词算法,总共分为了五个部分,想聊聊自己在各种场景中使用到的分词方法做 ...
- 『MXNet』第十二弹_再谈新建计算节点
上一节我们已经谈到了计算节点,但是即使是官方文档介绍里面相关内容也过于简略,我们使用Faster-RCNN代码中的新建节点为例,重新介绍一下新建节点的调用栈. 1.调用新建节点 参数分为三部分,op_ ...
- MCMC 浅谈
# MCMC 浅谈 1. 采样(sampling)是什么 MCMC在采样算法中有着举足轻重的地位,那么什么是采样?采样就是根据某种分布生成样本.举个例子,线性同余发生器就是根据均匀分布生成样本,这就很 ...
- 浅谈独立特征(independent features)、潜在特征(underlying features)提取、以及它们在网络安全中的应用
1. 关于特征提取 0x1:什么是特征提取 特征提取研究的主要问题是,如何在数据集未明确表示结果的前提下,从中提取出重要的潜在特征来.和无监督聚类一样,特征提取算法的目的不是为了预测,而是要尝试对数据 ...
- 以np.concatenate为主题,谈谈numpy数组按维度合并的问题
1.引言 最近在做多模态融合的图像问题,其中最需要解决的就是不同模态的图像用什么方法进行融合,最简单也最直观的方法就是采用合并数组的方法,将不同模态的图像合并为多通道进行处理.在一些论文中,比如< ...
- 《Machine Learning in Action》—— 浅谈线性回归的那些事
<Machine Learning in Action>-- 浅谈线性回归的那些事 手撕机器学习算法系列文章已经肝了不少,自我感觉质量都挺不错的.目前已经更新了支持向量机SVM.决策树.K ...
- TensorFlow 2.0 深度学习实战 —— 浅谈卷积神经网络 CNN
前言 上一章为大家介绍过深度学习的基础和多层感知机 MLP 的应用,本章开始将深入讲解卷积神经网络的实用场景.卷积神经网络 CNN(Convolutional Neural Networks,Conv ...
随机推荐
- iOS开发-沙盒(sandbox)机制
苹果前天发的财报,貌似现在用ios系统的比以前又多了一些,但是大家的iPhone购买的渠道也是五花八门,有的从非正规渠道购买的iPhone里的操作系统已经被越狱过,越狱这个事情和Android的roo ...
- Spring MVC 4.2 CORS 跨域访问
跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求.比如说,域名A(http://domaina.examp ...
- 对SingleTask和TaskAffinity的理解
最近研究微信调起自己客户端的事情,对于SingleTask和TaskAffinity的理解又多了一些理解. 以前对于Android的四种LaunchMode有一些了解,其中比较有意思的就是Single ...
- C#.NET常见问题(FAQ)-控制台程序如何输出Messagebox
1 添加如下引用 2 添加引用和Messagebox的代码. 3 测试可行 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/aceta ...
- C#.NET常见问题(FAQ)-如何把函数名作为参数传递给另一个函数
在主窗体中使用的还是普通的函数,但是test函数有一个新的参数,就是method 这个method所指向的就是前面委托定义的method 更多教学视频和资料下载,欢迎关注以下信息: 我的优 ...
- 灰度图像二值化-----c++实现
前天闲着没事干,就写了写BMP图像处理,感觉大家还比较感兴趣..所以现在没事,继续更新..这次简单的写了灰度图像二值化..这是什么概念呢? 图像的二值化的基本原理 图像的二值化处理就是将图像上的点的灰 ...
- PL/SQL之DBMS_SQL程序包使用(1)(学习笔记)
dbms_sql程序包dbms_sql程序包是系统提供给我们的另一种使用动态SQL的方法:使用DBMS_SQL包实现动态的SQL的步骤如下:1.将要执行的SQL语句或者一个语句放到一个字符串变量中2. ...
- HTML一(简介)
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...
- eclipse使用egit插件
本来想用myeclipse,奈何试过网上所列的常用方法,都无法成功安装egit插件.只得转到eclipse.话说eclipse不仅是免费的,启动也较myeclipse更为迅速,安装插件也非常顺利.使用 ...
- cordova 常用插件
一,插件相关常用命令 1,查看所有已经安装的插件 1 cordova plugin ls 2,安装插件(以camera插件为例) 1 cordova plugin add cordova-plug ...