算法基础:NP完全问题

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

相信稍微做过一点学术研究的都不会对“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完全问题。
  • 87
    点赞
  • 226
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法设计与分析 作者-王红梅 出版社-清华大学出版社 出版日期-07 1 2006. 共262页 目录 第 1 章 绪论 1 .1 算法的基本概念 1 . 1 . 1 为什么要学习算法 1 . 1 . 2 算法及其重要特性 1 . 1 . 3 算法的描述方法 1 . 1 . 4 算法设计的一般过程 1 . 1 . 5 重要的问题类型 1 .2 算法分析 1 . 2 . 1 渐进符号 1 . 2 . 2 最好、 最坏和平均情况 1 . 2 . 3 非递归算法的分析 1 . 2 . 4 递归算法的分析 1 . 2 . 5 算法的后验分析 1 .3 实验项目— — —求最大公约数 阅读材料— — —人工神经网络与 BP 算法 习题 1 第 2 章 NP 完全理论 2 .1 下界 2 . 1 . 1 平凡下界 2 . 1 . 2 判定树模型 2 . 1 . 3 最优算法 2 .2 算法的极限 2 . 2 . 1 易解问题与难解问题 2 . 2 . 2 实际问题难以求解的原因 2 . 2 . 3 不可解问题 2 .3 P 类问题NP问题 2 .3 .1 判定问题 2 .3 .2 确定性算法与 P 类问题 2 .3 .3 非确定性算法NP问题 2 .4 NP 完全问题 2 .4 .1 问题变换与计算复杂性归约 2 .4 .2 NP 完全问题的定义 2 .4 .3 基本的 NP 完全问题 2 .4 .4 NP 完全问题的计算机处理 2 .5 实验项目— — —SAT 问题 阅读材料— — —遗传算法 习题 2 第 3 章 蛮力法 3 .1 蛮力法的设计思想 3 .2 查找问题中的蛮力法 3 .2 .1 顺序查找 3 .2 .2 串匹配问题 3 .3 排序问题中的蛮力法 3 .3 .1 选择排序 3 .3 .2 起泡排序 3 .4 组合问题中的蛮力法 3 .4 .1 生成排列对象 3 .4 .2 生成子集 3 .4 .3 0 / 1 背包问题 3 .4 .4 任务分配问题 3 .5 图问题中的蛮力法 3 .5 .1 哈密顿回路问题 3 .5 .2 TSP 问题 3 .6 几何问题中的蛮力法 3 .6 .1 最近对问题 3 .6 .2 凸包问题 3 .7 实验项目— — —串匹配问题 阅读材料— — —蚁群算法 习题 3 第 4 章 分治法 4 .1 概述 4 .1 .1 分治法的设计思想 4 .1 .2 分治法的求解过程 4 .2 递归 4 .2 .1 递归的定义 4 .2 .2 递归函数的运行轨迹 4 .2 .3 递归函数的内部执行过程 4 .3 排序问题中的分治法 4 .3 .1 归并排序 4 .3 .2 快速排序 4 .4 组合问题中的分治法 4 .4 .1 最大子段和问题 4 .4 .2 棋盘覆盖问题 4 .4 .3 循环赛日程安排问题 4 .5 几何问题中的分治法 4 .5 .1 最近对问题 4 .5 .2 凸包问题 4 .6 实验项目— — —最近对问题 阅读材料— — —鱼群算法 习题 4 第 5 章 减治法 5 .1 减治法的设计思想 5 .2 查找问题中的减治法 5 .3 排序问题中的减治法 5 .4 组合问题中的减治法 5 .5 实验项目— — —8 枚硬币问题 阅读材料— — —粒子群算法 习题 5 第 6 章 动态规划法 6 .1 概述 6 .2 图问题中的动态规划法 6 .3 组合问题中的动态规划法 6 .4 查找问题中的动态规划法 6 .5 实验项目— — —最大子段和问题 阅读材料— — —文化算法 习题 6 第 7 章 贪心法 7 .1 概述 7 .2 图问题中的贪心法 7 .3 组合问题中的贪心法 7 .4 实验项目— — —霍夫曼编码 阅读材料— — —模拟退火算法 习题 7 第 8 章 回溯法 8 .1 概述 8 .2 图问题中的回溯法 8 .3 组合问题中的回溯法 8 .4 实验项目— — —0/ 1 背包问题 阅读材料— — —禁忌搜索算法 习题 8 第 9 章 分支限界法 9 .1 概述 9 .2 图问题中的分支限界法 9 .3 组合问题中的分支限界法 9 .4 实验项目— — —电路布线问题 阅读材料— — —免疫算法 习题 9 第 10 章 概率算法 10 .1 概述 10 .1 .1 概率算法的设计思想 10 .1 .2 随机数发生器 10 .2 舍伍德(Sherwood)型概率算法 10 .2 .1 快速排序 10 .2 .2 选择问题 10 .3 拉斯维加斯( Las Vegas)型概率算法 10 .3 .1 八皇后问题 10 .3 .2 整数因子分解问题 10 .4 蒙特卡罗(Monte Ca rlo)型概率算法 10 .4 .1 主元素问题 10 .4 .2 素数测试问题 10 .5 实验项目— — —随机数发生器 阅读材料— — —DNA 计算与 DNA 计算机 习题 10 第 11 章 近似算法 11 .1 概述 11 .1 .1 近似算法的设计思想 11 .1 .2 近似算法的性能 11 .2 图问题中的近似算法 11 .2 .1 顶点覆盖问题 11 .2 .2 TSP 问题 11 .3 组合问题中的近似算法 11 .3 .1 装箱问题 11 .3 .2 子集和问题 11 .4 实验项目— — —TSP 问题的近似算法 阅读材料— — —量子密码技术 习题 11 第 12 章 计算复杂性理论 12 .1 计算模型 12 .1 .1 图灵机的基本模型 12 .1 .2 k 带图灵机和时间复杂性 12 .1 .3 离线图灵机和空间复杂性 12 .2 P 类问题NP问题 12 .2 .1 非确定性图灵机 12 .2 .2 P 类语言和 NP 类语言 12 .3 NP 完全问题 12 .3 .1 多项式时间变换 12 .3 .2 Cook 定理 12 .4 实验项目— — —NP 完全问题树 阅读材料— — —算法优化策略
### 回答1: 算法导论第三版中介绍了很多重要的算法问题,其中有一个非常重要的概念就是NP完全性。 NP完全性是指一个问题在多项式时间内可以验证解的正确性,并且任何其他的NP问题都可以在多项式时间内归约到该问题。也就是说,如果我们找到了一个问题NP完全的,那么我们可以认为这个问题是非常困难的,并且很难找到一个高效的算法来解决它。 通过证明问题NP完全的,我们可以得出两个非常重要的结论: 1. 如果一个问题NP完全的,那么如果我们能够找到一个多项式时间算法来解决该问题,那么就可以得到一个多项式时间算法来解决所有的NP问题。因此,如果我们能够找到一个多项式时间算法来解决NP完全问题中的任何一个问题,那么我们就能够解决所有的NP问题,这意味着P=NP。 2. 如果一个问题NP完全的,那么我们可以使用已知了多项式时间不可能存在的算法来解决它。这也就是说,如果我们能够证明一个问题NP完全的,那么我们可以认为该问题是非常困难的,很可能不存在高效的解决方法。 在算法导论第三版中,作者通过介绍SAT问题、3-SAT问题、图的着色问题等经典NP完全问题的证明过程,帮助读者理解NP完全性的概念和应用。同时,也介绍了一些常用的求解NP完全问题的启发式算法、近似算法等。 总之,算法导论第三版给我们提供了一个深入理解NP完全性的基础,通过学习和理解这些内容,我们可以更好地认识到NP完全性的重要性和复杂性,并且可以应用到实际问题中去解决。 ### 回答2: 算法导论第三版中介绍了NP完全性,指的是一类问题,虽然没有有效算法可以在多项式时间内解决它们,但可以在多项式时间内验证解的正确性。 NP问题(Nondeterministic Polynomial)是指可以在多项式时间内验证解的问题。如果一个问题可以在多项式时间内验证一个解是否正确,那么这个问题就属于类似于NP问题。 而NP完全问题是指既属于NP问题又属于最难的问题。它是对于所有属于NP问题问题而言最难解决的问题。如果某个问题属于NP完全问题,那么如果能找到一个多项式时间的算法解决这个问题,那么NP问题的所有问题都可以在多项式时间内解决。 尽管NP完全性并无明确的定义,但可以使用以下两个策略来证明一个问题NP完全问题: 1. 证明问题属于NP问题:证明可以在多项式时间内验证一个解的正确性。 2. 使用约简证明:证明问题A可以约简为已知是NP完全问题问题B,这意味着如果B问题有多项式时间的解法,则A问题也有多项式时间的解法。 有许多已知的NP完全问题,比如旅行商问题(TSP)、子集和问题(Subset Sum)、背包问题(Knapsack)等等。证明了一个问题NP完全问题,意味着无论采用什么算法,都无法在多项式时间内找到一个确定性算法来解决该问题,除非P=NP,而这是一个未解决的数学难题。 总之,NP完全性是算法导论中重要的概念,它帮助我们理解一类在多项式时间内难以解决的问题,并为算法设计和分析提供了参考。 ### 回答3: 算法导论中,第三版中有关NP完全性的答案主要包括以下几个方面的内容: 1. NP问题NP完全问题的定义:对于一个问题,如果可以在多项式时间内验证一个解的可行性,那么这个问题就属于NP问题。而NP完全问题则是指满足两个条件:首先,问题本身是一个NP问题;其次,该问题能够通过多项式时间的约约化转化为其他NP问题。 2. NP完全性的证明方法:证明一个问题NP完全的方法有两个主要步骤。首先,需要证明该问题是一个NP问题,即可以在多项式时间内验证一个解的可行性。其次,需要通过将已知的NP完全问题进行转化约约化,以证明该问题也可以在多项式时间内约约化为其他NP问题。最常用的约约化方法是通过对问题实例进行编码和变换来实现。 3. NP完全性的重要性:NP完全问题是计算机科学中的核心问题之一。这些问题的复杂性是如此高,以至于目前尚未找到多项式时间的解法。因此,研究NP完全问题有助于我们对计算理论的深入理解,也对于解决实际问题算法设计具有重要指导意义。此外,NP完全问题还与许多经典问题如旅行商问题、图着色问题等密切相关。 4. NP完全问题的应对策略:由于目前尚未找到NP完全问题的多项式时间解法,因此在面对这些问题时,我们常常采取以下策略:一是尝试使用近似算法或启发式算法来寻找高效的近似解;二是利用某些特殊性质或条件对问题进行简化和约束,以降低问题复杂性;三是采用分治、动态规划等算法设计技巧,对问题进行优化和求解。 综上所述,NP完全性是算法导论第三版中重要的概念之一,它涉及到了计算理论中复杂性问题的定义、证明方法、重要性以及解决策略。研究NP完全问题对于算法设计和理论研究具有重要意义,也有助于我们更好地理解计算理论的核心概念和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值