本博客所有内容均整理自《算法图解》,欢迎讨论交流~

相信稍微做过一点学术研究的都不会对“NP完全问题”这个概念感到陌生。它是千禧难题之首。

对于NP完全问题的定义,百度百科是这样给出的:NP完全问题(NP-C问题),是世界七大数学难题之一。 NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题。简单的写法是 NP=P?,问题就在这个问号上,到底是NP等于P,还是NP不等于P。

通俗地来说,有些计算问题是确定性的,比如加减乘除之类,你只要按照公式推导,按部就班一步步来,就可以得到结果。但是,有些问题是无法按部就班直接地计算出来的。一般这种无法按部就班计算出来的问题,只能通过穷举法等暴力的方法来解决。


1、旅行商问题

对于NP完全问题,有一个经典的例子,就是旅行商问题。

假如你是一个旅行商,需要前往5个不同的城市,当然,你希望找出前往这5个城市的最短路径。为此,你必须计算每条可能的路径,然后一一对比。

那么这里就不得不考虑一个问题了,前往5个城市,可能的路径有多少条呢?

为了解决这个问题,我们先来考虑只有两个城市的情形,然后依次增加城市数量。

2个城市:

对于两个城市,可供选择的路径有两条,如下图所示:

这里可能会有一点争议,那就是理论上来说,从A到B和从B到A应该是相同的,但是实际生活中经常会遇到单行道,所以我们在这里认为从A到B和从B到A不同。

于是,涉及两个城市时,可能的路线有两条。

3个城市:

现在增加一个城市,我们考虑有3个城市的情况。

此时,我们需要首先考虑从哪一个城市出发,有3种情况,而从每个城市出发时,都有两条不同的路线,所以总共有6条路线:

4个城市:

接下来是4个城市的情况。

我们依然是首先考虑从哪个城市出发,于是有4种情况,而选定了出发城市之后,便剩下3个城市,这3个城市的可能路径为6条,所以在选定出发城市的情况下,又分别有6条不同的路径,所以总路径数为4*6=24条。

这里就不详细画出来了。

其实这个问题不难看出来是一个数字阶乘的问题,即涉及n个城市时,可能的路径条数为n!条

所以前面我们提出的问题就可以有解了,即5个城市时,可能的路线有5!=1*2*3*4*5=120条!

于是,为了寻找这5个城市的最优路线,我们需要遍历120种可能路线,然后一一对比来获取最优路线!

如果你认为这并不是一个多么困难的事情,那么试想一下如果是10个城市呢?10!=3628800。也就是说,你需要计算的可能路线超过300万条。很明显,这很难。

旅行商问题总结一下就是:你需要计算所有的解,并从中选出最小/最短的那一个。为此你必须遍历所有可能,然后一一比对。

旅行商问题就是一个很经典的NP完全问题。


2、集合覆盖问题

还有一种很典型的NP完全问题称为集合覆盖问题。

假设你正在为一个虚构的橄榄球队挑选队员,报名的球员名单如下图所示:

该名单无非就是各个报名选手具备的各种橄榄球技巧。

当然,为了组成一支有实力的球队,我们不可能光挑选一个方面的球员,自然是要挑选各个方面的优秀球员,而且由于名额有限,我们必须在已有的资源中选择一个最优的球员组合。

于是,我们需要列出一个需要的橄榄球技巧清单:优秀的四分卫,优秀的跑卫,擅长雨中作战,能承受压力,等等等等。

在现有的报名选手中,我们根据上面列出的技巧清单来寻找一个最优的球员组合。

面对这个问题,我们可以使用贪婪算法来解决:

  1. 找出符合最多要求的报名选手。
  2. 不断重复这个过程,直到球队满足要求或者球队名额已满。

很明显,这是一个集合覆盖问题,根据上面的报名清单我们可以获得以下的集合:

这是只有几个人的情况,如果报名人数多了,这个集合覆盖问题会非常复杂。我们必须一次次找出覆盖面积(或覆盖关键词)最多的集合,直到满足条件。

集合覆盖问题也是一个很典型的NP完全问题。


3、如何识别NP完全问题

既然NP完全问题是多项式复杂程度的非确定性问题,简言之就是难解决的问题,自然也是难判别的。

其实,根本没有一个定理来判断一个问题是否是NP完全问题。只是,还是有很多线索可以帮助我们来做识别的。这些线索罗列如下:

  • 元素较少时算法的运行速度非常快,但随着元素数目的增加,速度会变得非常慢。
  • 涉及“所有组合”的问题通常是NP完全问题。
  • 不能采用分治法的思想将大问题分解成小问题,必须考虑各种可能情况,这很可能是NP完全问题。
  • 如果问题涉及“序列”或“集合”,并难以解决,很可能就是NP完全问题。
  • 如果问题可转换为旅行商问题或集合覆盖问题,那就肯定是NP完全问题。

算法基础:NP完全问题相关推荐

  1. 【算法】NP完全问题以及世界数学七大难题

    NP完全问题(NP-C问题),是世界七大数学难题之一. 1.NP完全问题 P (确定性多项式算法)对NP (非确定性多项式算法) 人们发现,所有的完全多项式非确定性问题,都可以转换为一类叫做满足性问题 ...

  2. 算法:NP问题,NP完全问题(NPC),NPhard问题

    在做计算机算法关于NP完全问题这一章的作业的时候,发现有很多概念理解的不是很透彻,然后就反复看老师的讲义,在网上查阅各种资料,花了很多时间来弄懂这块的内容.发现书上的概念太正式,定义太标准,不容易很快 ...

  3. NP完全问题与近似算法:贪婪策略|Python实现

    1. 集合覆盖问题 假设我们创建了一个自己的电台,希望让整个市区的人都可以听到我们的节目.然而,这个城市有许多不同的广播公司,购买它们服务的电台可以让自己的节目覆盖某一块区域,并且这些区域常常是重叠的 ...

  4. 算法4类问题:P问题、NP问题、NP完全问题、NP难问题

    在讲P类问题之前先介绍两个个概念:多项式,时间复杂度. 1.多项式:axn-bxn-1+c 称为x最高次为n的多项式 2.时间复杂度 时间复杂度表示所需的计算工作量,当输入值接近无穷时,算法所需工作量 ...

  5. 算法中的P问题、NP问题、NP完全问题和NP难问题梳理

    结论(可以简单这么初步认识):NPH>NPC>NP>或=P 在讲P类问题之前先介绍两个个概念:多项式,时间复杂度.(知道这两概念的可以自动跳过这部分) 1.多项式: axn−bxn− ...

  6. [总结]算法中的P问题、NP问题、NP完全问题和NP难问题

    在讨论算法的时候,常常会说到这个问题的求解是个P类问题,或者是NP难问题等等,于是我特地搜了这方面的资料,自己总结了下,估计研究算法的大家应该都知道,要是我总结的哪里不对,欢迎一起探讨~ 在讲P类问题 ...

  7. 算法中的P问题、NP问题、NP完全问题和NP难问题

    在讨论算法的时候,常常会说到这个问题的求解是个P类问题,或者是NP难问题等等,于是我特地搜了这方面的资料,自己总结了下,估计研究算法的大家应该都知道,要是我总结的哪里不对,欢迎一起探讨~ 在讲P类问题 ...

  8. np完全问题的例子_MIT开发光子算法,试图解决世界7大数学难题的“NP完全问题”...

    2000年5月,美国克雷数学研究所(Clay Mathematics Institute,CMI)提出7个数学难题,称为"千禧年大奖难题",挑战者每解出1道题目,若通过两年验证期和 ...

  9. 算法中的P问题、NP问题、NP难问题和NP完全问题

    P问题:该问题存在一个可以在多项式时间内解决该问题的算法.(P:polynominal,多项式) 为什么我们要研究这个?因为计算机处理的输入常常不是那么几十个几千个那么一点点,想象一下,当计算机处理的 ...

  10. 《算法图解》学习笔记(八):贪婪算法和NP完全问题(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

最新文章

  1. Unity3D学习笔记(二) 一些常用的空间函数
  2. springboot发送http请求
  3. 在Kotlin中 使用js 函数
  4. spring学习(13):使用junit4进行单元测试续
  5. Python使用threading实现多线程
  6. 生产环境下 RocketMQ 为什么不能开启自动创建主题?
  7. Git使用方法(三)-小技巧篇
  8. JSR-303校验-转载
  9. 极客战记计算机科学2村庄守卫,「网易官方」极客战记(codecombat)攻略-森林-村庄守护神-village-champion...
  10. The chain rule(链式法则)
  11. java 求arctan()
  12. 【QGIS入门实战精品教程】10.1:QGIS基于DEM数据的地形分析案例教程
  13. html中label如何居中,怎么让label标签中的文字居中显示
  14. 美容院没有顾客怎么办
  15. 12年数学建模葡萄酒c语言,葡萄酒的评价问题—2012年全国大学生数学建模竞赛B题...
  16. Zip明文攻击细节问题及解决方案
  17. 东半球最先进的debug技巧
  18. 根据文件头检测文件类型的完整代码
  19. 矩阵分析——Jordan标准形
  20. Markdown 实现页内跳转

热门文章

  1. 第三十九章 Caché 函数大全 $MATCH 函数
  2. ITIL规范(持续更新)
  3. echarts中国地图
  4. mysql java驱动 ibm_转!!各种数据库的jdbc驱动下载及连接方式
  5. SplitContainer的使用
  6. 一篇吃透前置加加和后置加加(附练习题)
  7. STM8S_007_片内FLASH和EEPROM编程
  8. QQ炫舞新上线紫钻Lv9和皇冠贵族Lv11 QQ炫舞紫钻9级图标上线
  9. Java读取文件的N种方法
  10. [RE]如何调整堆栈平衡