项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

看相关算法的paper的时候,经常会出现NP-Hard这个词。本博主也不是纯数学系出身,对于这么高深的问题自然没有特别深入独到的理解。但是本博主的习惯就是看到一个东西老在眼前晃来晃去但自己还不是很明白,就有强迫症一定要搞明白这到底是个什么玩意。so,咱们就来看看这个NP-Hard问题,怎么用最简单的方式去了解。

1.世界七大数学难题之首

2000年,美国克莱数学研究所公布了世界七大数学难题,又称千禧年大奖难题。其中P与NP问题被列为这七大世界难题之首,从而大大激发了对这一问题的研究热情。

普林斯顿大学计算机系楼将二进制代码表述的“P=NP?”问题刻进顶楼西面的砖头上。如果证明了P=NP,砖头可以很方便的换成表示“P=NP!”。
康奈尔大学的Hubert Chen博士提供了这个玩笑式的P不等于NP的证明:
反证法。设P = NP。令y为一个P = NP的证明。证明y可以用一个合格的计算机科学家在多项式时间内验证,我们认定这样的科学家的存在性为真。但是,因为P = NP,该证明y可以在多项式时间内由这样的科学家发现。但是这样的发现还没有发生(虽然这样的科学家试图发现这样的一个证明),我们得到了矛盾。(上面内容来自wiki百科)

难怪本博主之前对这个问题理解不深刻。看到上面的资料宝宝放心了,说明宝宝智商还是正常的。

2.算法复杂度

要计算或解决一个问题,该问题通常有一个大小规模,用n表示。例如,若分析计算一个二进制数,该数有多少位,这个位就是其大小规模。再比如,从n个数里面找出最大的那个数,这个n就是该问题的规模大小。怎么找?我们要比较n-1次才能得到结果,这个n-1就是所花的时间,也就是时间复杂度。再比如,将n个数按从大至小排序,n是其规模大小,若是我们按这样的方法:第一次从n个数里找最大,第二次从n-1个数里找最大,以此类推,需要的比较次数就是n(n-1)/2,称我们所用的方法为算法,称n(n-1)/2为该算法的时间复杂度。对于时间复杂度,当n足够大时,我们只注重最高次方的那一项,其他各项可以忽略,另外,其常数系数也不重要,所以,n(n-1)/2我们只重视n的平方这一项了,记为O(n的平方),这就是该算法对该问题的时间复杂度的专业表示。
上面这段描述,估计大家都能看懂,就不在啰嗦了。重点在下面,前方高能预警,大家注意了。

所有形如a∗nk+b∗n(k−1)+c∗n(k−2)+⋯a*n^k+b*n^{(k-1)}+c*n^{(k-2)}+\cdotsa∗nk+b∗n(k−1)+c∗n(k−2)+⋯都可记为O(nk)O(n^k)O(nk),$ nk$为n的k次方,*自然就是乘法了,这样的复杂度为多项式(polynomial)时间复杂度。若是时间复杂度为$kn,k为大于1的常数,或者,k为大于1的常数,或者,k为大于1的常数,或者n!的时间复杂度,或者比的时间复杂度,或者比的时间复杂度,或者比n!$更大的时间复杂度 ,就称为指数型时间复杂度。显然,当n足够大时,指数型时间比多项式要大得多的多。

3.P问题与NP(Non-deterministic Polynomial )问题

所有能用多项式时间算法计算得到结果的问题,称为多项式问题,也就是P,所有绝对不可能用多项式时间求解的可解问题,称为指数型问题。当然,还有一类问题属于不可解问题,也就是说你无论花多少时间也不能得到解答。

有这样一类问题,假使你得到了问题的解,我要验证你的解是否正确,我验证所花的时间是多项式,至于求解本身所花的时间是否是多项式我不管,可能有多项式算法,可能没有,也可能是不知道,这类问题称为NP问题。
NP概念的奥妙在于,它躲开了求解到底需要多少时间这样的问题,而仅仅只是强调验证需要多少时间,从而为P与NP这一千年难题的产生埋下了伏笔。显然,P肯定是NP,因为你既然能用多项式求解,就肯定能用多项式验证(难不成我再算一遍!),但NP是否是P谁也确定不了。另外,目前已经很明确的指数型问题也肯定不是NP。

用通俗的话来解释,NP问题就是其解的正确性很容易被检验出来,这里的很容易检验指的是存在一个多项式算法。

4.最具代表性的NP-Hard问题:TSP

售货员旅行问题 (traveling salesman problem),是最具有代表性的NP问题之一。假设一个推销员需要从香港出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。现在假设公司只给报销 C 块钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?
推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排! 这将是个天文数字。
这个天文数字到底有多大?目前的方法接近一个一个的排着试,还没有找到更好可以寻得最短路径的方法。对七个城而言,共有 6!=720 个排法,还比较简单;,但若有 20 个城,则排法就有 19! 种。因故在排列组合里 n! 写起来轻松。但 1.21∗10171.21*10^{17}1.21∗1017 是一个大得不得了的数字。若每秒钟排一次,要排 3.84∗1093.84*10^93.84∗109 年(一年约为 3.15∗1073.15*10^73.15∗107 秒),即使使用计算器,每秒排一百万次(不容易做到)也得重做三千年才能找到答案。「生也有涯,知也无涯」,想不到区区二十个城,要三十个世纪才能找到答案。

说到这里为止,童鞋们应该对NP-Hard有个大致的了解了吧!

NP-Hard问题浅谈相关推荐

  1. python np array归一化_浅谈利用numpy对矩阵进行归一化处理的方法

    浅谈利用numpy对矩阵进行归一化处理的方法 本文不讲归一化原理,只介绍实现(事实上看了代码就会懂原理),代码如下: def Normalize(data): m = np.mean(data) mx ...

  2. python列表和数组区别java_浅谈numpy中np.array()与np.asarray的区别以及.tolist

    array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会. 1.输入为列表时 ...

  3. python数学库的使用方法_浅谈numpy库的常用基本操作方法

    NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是一个一维数 ...

  4. opencv运动目标跟踪预测_浅谈多目标跟踪中的相机运动

    ©PaperWeekly 原创 · 作者|黄飘 学校|华中科技大学硕士生 研究方向|多目标跟踪 之前的文章中我介绍了 Kalman 滤波器,这个算法被广泛用于多目标跟踪任务中的行人运动模型.然而实际场 ...

  5. 浅谈L0,L1,L2范数及其应用

    原文传送门:浅谈L0,L1,L2范数及其应用 浅谈L0,L1,L2范数及其应用 在线性代数,函数分析等数学分支中,范数(Norm)是一个函数,其赋予某个向量空间(或矩阵)中的每个向量以长度或大小.对于 ...

  6. 浅谈多目标跟踪中的相机运动

    ©PaperWeekly 原创 · 作者|黄飘 学校|华中科技大学硕士生 研究方向|多目标跟踪 之前的文章中我介绍了 Kalman 滤波器,这个算法被广泛用于多目标跟踪任务中的行人运动模型.然而实际场 ...

  7. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  8. 机器学习 —— 浅谈贝叶斯和MCMC

    ‍‍Abstract:最近课业内的任务不是很多,又临近暑假了,就在网上搜了一些有关于机器学习和深度学习的课程进行学习.网上的资料非常繁多,很难甄别,我也是货比三家进行学习.这是这个系列的第一个笔记,是 ...

  9. python 中arange函数_浅谈Python中range与Numpy中arange的比较

    本文先比较range与arange的异同点,再详细介绍各自的用法,然后列举了几个简单的示例,最后对xrange进行了简单的说明. 1. range与arange的比较 (1)相同点:A.参数的可选性. ...

  10. [深度学习-原理]浅谈Attention Model

    系列文章目录 深度学习NLP(一)之Attention Model; 深度学习NLP(二)之Self-attention, Muti-attention和Transformer; 深度学习NLP(三) ...

最新文章

  1. 深度学习中的优化算法之MBGD
  2. valgrind概述及错误分析
  3. MPB:中大李文均组-河口水体和沉积物中微生物的分离培养与鉴定
  4. Luhn算法验证信用卡的合法性
  5. tomcat基本使用,就是这么简单
  6. VTK:网格之IdentifyHoles
  7. 基于Google Reader发展起来的个性化推荐系统之三大问题
  8. java 本季度_Java获取当天、本周、本月、本季度、本年等 开始及结束时间
  9. Python面试必须要了解的15个问题
  10. 各位学Python的要小心了!!!
  11. .bat批处理命令常用操作
  12. 思科与华为设备OSPF配置命令对比
  13. 深度学习--- GAN网络原理解析
  14. 精品软件试用及分享 屏幕录像专家注册版 附下载地址
  15. blender基本翻译+快捷键
  16. 维护机房服务器工作,机房维护(服务器搬迁方案).doc
  17. vscode连接服务器不用每次都输入密码
  18. 【Day2.1】时差为看日出创造了条件
  19. cearte-react-app中craco中优雅引入svg【自定义宽、高、颜色,仅需5步】
  20. Mosquitto服务安装与使用---入门操作介绍

热门文章

  1. Spring MVC 实现文件的上传和下载
  2. android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app
  3. IE8 SVG Viewer下一些对象属性和方法
  4. 安全狗云备份爆笑段子~~~如果上天再给我一次机会
  5. 三层结构对多语言的支持
  6. 用 maven 命令启动项目和直接用tomcat 启动项目的区别
  7. Android ViewPropertyAnimator:让动画变得简单起来!
  8. 聊聊spring security oauth2的password方式的认证
  9. Warning the user/local/mysql/data directory is not owned by the mysql user
  10. js计算html的font-size