【算法设计】P和NP问题的前世今生
算法设计——P和NP问题的前世今生
- 什么是P和NP问题
- 背景
- 著名的NP问题——TSP问题
- NP类问题=P类问题?
- 约化
- NPC问题
- 定义
- 证明思路
- NPC意义
- NP难问题(NP-hard问题)
- 解决N=NP问题的意义
- 展望
- 参考资料
什么是P和NP问题
背景
20世界科学家在研究如何用巨大的复古电脑解决世界上所有的问题时,第一版被使用的程式通常都会特别慢,随着时间的推移,人们会想出巧妙方法来使它变得更快,可是对于另一些问题,没有人能想出更快的程式。
为了解决这些事情,他们以问题的解决速度来做问题的分类,像乘法问题,有非常快的程式可解,但像下一盘完美的棋,就没有那么快的程式可解了。
但介于这两者间的问题,他们不知道是否存在快速的解法,此时有了P和NP问题
- P问题:存在多项式时间算法的问题。 所有可以用相当快速度解决的问题,如乘法问题。
- np问题:能在多项式时间内验证得出一个正确解的问题。,比如数独我不能很快时间内给出正确答案,但是给了正确答案后我能很快的去验证是否正确。
著名的NP问题——TSP问题
-旅行家推销问题(TSPTSPTSP)。即有一个推销员,要到nnn个城市推销商品,他要找出一个包含所有nnn个城市的环路,这个环路路径小于aaa。我们知道这个问题如果单纯的用枚举法来列举的话会有(n−1)!(n-1)!(n−1)! 种,已经不是多项式时间的算法了,(注:阶乘算法比多项式的复杂)。那怎么办呢?我们可以用猜的,假设我人品好,猜几次就猜中了一条小于长度aaa的路径,我画画画画,好的,我得到了一条路径小于aaa的环路,问题解决了,皆大欢喜。可是,我不可能每次都猜的那么准,也许我要猜完所有种呢?所以我们说,这是一个NPNPNP类问题。也就是,我们能在多项式的时间内验证并得出问题的正确解,可是我们却不知道该问题是否存在一个多项式时间的算法,每次都能解决他(注意,这里是不知道,不是不存在)。
NP类问题=P类问题?
所以这就引出了这类讨论的一个千年问题:是否 NP类问题=P类问题?即,是否所有能在多项式时间内验证得出正确解的问题,都是具有多项式时间算法的问题呢?太让人震惊了,要是解决了这个问题,那岂不是所有的NP问题都可以通过计算机来解决?
约化
所谓问题约化就是,可以用问题B的算法来解决A ,我们就说问题A可以约化成问题B。举个例子,一元一次方程的求解,跟二元一次方程的求解,我们知道,只要能求解二元一次方程,那就可以用二元一次方程的解法来求解一元一次方程,只需要将一元一次方程加上y,并附加一个方程y=0就可以将一元一次方程变形为一个二元一次方程,然后用二元一次方程的解法来求解这个方程。注意,这里二元一次方程的解法会比一元一次的复杂。所以我们说,只需要找到解二元一次方程的规则性解法,那就能用这个规则性解法来求解一元一次方程。
为了证明这个千古难题,科学家想出了很多办法。其中之一就是问题的约化。从这里也可以看出,约化是具有传递性的,如A约化到B,B约化到C,A就可以约化到C,同时不断约化下去,我们会发现一个很惊人的特性,就是他一定会存在一个最大的问题,而我们只需要解决了这个问题,那其下的所有问题也就解决啦!这就是我们所说的NPC问题的概念!!!
NPC问题
定义
存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。需满足以下两个条件:
- 是一个NP问题;
- 所有的NP问题都可以约化到它。
证明思路
先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它。
NPC意义
引到NP问题里就是,对于同一类的所有的NP类问题,若他们都可以在多项式时间内约化成最难的一个NP类问题,(我们直观的认为,被约化成的问题应具有比前一个问题更复杂的时间复杂度)当我们针对这个 时间复杂度最高的超级NP问题 要是能找到他的多项式时间算法的话,那就等于变向的证明了其下的所有问题都是存在多项式算法的,即NP=P!!!!
NP难问题(NP-hard问题)
满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广,NP-Hard问题没有限定属于NP),即所有的NP问题都能约化到它,但是他不一定是一个NP问题。
NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。**即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。**事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。
以上四个问题他们之间的关系可以用下图来表示:
解决N=NP问题的意义
只要问题不会指数级增长,我们要等的就是电脑变强来解决这些问题
图中魔方只是问题越来越复杂的泛化,不代表魔方解决是ppp问题
np问题即非确定性多项式时间,用数学术语可以解释为如果你有无限多部电脑,可以在同一时间内检查所有可能答案,就可以在多项式时间内找到正确解答
所有的np问题的解决最终归结为用简单的多项式时间转换,即“NP-complete”问题,类似研究蛋白质的折叠以解决癌症问题,许多金融难题许多领域的重大难题都可以归结为“NP-complete”,一旦解决“NP-complete”,各个领域将迎来改变。
展望
计算机算法的问题很多,多项式层叠,指数层叠,最外围的甚至是没有任何一台电脑在任意时间和空间可解出来的问题,这里我们不仅看到计算的特性还有时间和空间本身的特性,这一团乱七八糟的算法复杂度分类甚至会影响物理学,生物学和我们所了解的一切基本!
参考资料
世界七大数学难题之一: P与NP复杂度问题 | 熟肉
P问题、NP问题、NP完全问题和NP难问题
【算法设计】P和NP问题的前世今生相关推荐
- 算法设计与分析第5章 回溯法(二)【回溯法应用】
第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...
- 哈工大威海算法设计与分析_计算机算法设计与分析第一章 算法概述
晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...
- 算法设计与分析——算法思想总结
算法设计与分析 1.分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归的解这些子问题,然后将各子问题的解合并得到原问题的解. 分治法所能解 ...
- 【算法设计与分析】02 货郎问题与计算复杂性理论
什么是NP系列问题?今天来看看这些问题. 文章目录 1 货郎问题 2 0-1背包问题 3 什么是NP-hard问题(NP难问题) 1 货郎问题 问题:有n个城市,已知任何两个城市之间的距离,求一条每个 ...
- 国科大计算机算法设计与分析陈玉福,中科院陈玉福计算机算法设计与分析期末简答题答案.pdf...
中科院陈玉福计算机算法设计与分析期末简答题答案 1. 贪心算法和动态规划算法有什么共同点和区别?它们都有那些优势和劣势? 共通点:动态规划和贪心算法都是一种递推算法 ,均有局部最优解来推导全局最优解 ...
- 用GA算法设计22个地点之间最短旅程-R语言实现
数据挖掘入门与实战 公众号: datadw 相关帖子 转载︱案例 基于贪心算法的特征选择 用GA算法设计22个地点之间最短旅程-R语言实现 ----------------------------- ...
- 【算法设计与分析】经典常考三十三道例题AC代码
❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...
- 01背包问题 —— 【算法设计】动态规划
动态规划 问题背景 有N个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 注意:01背包问题要求一个物品只有0/1两种状态,即装入背包或不装入背包.不能将 ...
- 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt
<王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...
最新文章
- 计算机图形学直线扫描转论文,计算机图形学实验报告-实验1直线段扫描转换.doc...
- 挣值管理不是搞数字游戏
- cmd 调用webservice接口_c# 三种方法调用WebService接口
- Android开发之Android Studio第三方库的六种依赖讲解说明
- C语言中生成可执行程序的过程
- Custom.pll : ZOOM小测试
- 忽略这一点,人工智能变人工智障的!
- AI学习笔记(十一)CNN之图像识别(下)
- 浅谈C中的malloc和free\\感谢lj_860603,工作了,没时间验证了,觉得挺好的,转载了...
- P1018 乘积最大(高精度加/乘)
- 解决安卓GridView的横向滚动问题
- python3---情感分析(基于词典中文)
- C语言利用回调函数实现qsort函数
- TX2与PCA9685驱动舵机(RACECAR)
- 华为 36 岁工程师猝死,曾 22 月无休:比挣钱更重要的是活着
- Echarts实现以秒为单位的动态三条折线图显示
- ECS 7天实践训练营day5-安装Linux服务器面板管理工具
- 360 2015校园招聘
- 首发!小牛电动股权巨震:李一男、胡依林大幅减持,纪源资本退出
- 【原创】 ES5高效封装WIN10系统教程2020系列(五)常用软件安装及设置
热门文章
- Android面试过程描述
- python数据收集整理教案_(完整版)《数据收集整理(例1)》教案
- 学习yade的日常犯错2019.4.7
- 毕业4年年薪200万,一个CTO的成长之路
- Leetcode36. 有效的独数
- 计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw
- serface rt 应用软件分享 --持续更新
- 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系
- 在slicer中编写scripted模块
- 山东省高新技术企业培育入库申报材料