算法4类问题:P问题、NP问题、NP完全问题、NP难问题
在讲P类问题之前先介绍两个个概念:多项式,时间复杂度。
1、多项式:axn-bxn-1+c
称为x最高次为n的多项式
2、时间复杂度
时间复杂度表示所需的计算工作量,当输入值接近无穷时,算法所需工作量的变化快慢程度。
一般取多项式的最高次阶作为算法的时间复杂度。
举个例子:冒泡排序。
在计算机当中,排序问题是最基础的,将输入值按照大小或其他规则排好序,有利于后期运用数据进行其他运算。
假设手上现在有n个无序的数,利用冒泡排序对其进行排序:
①首先比较第1个数和第2个数,如果后者>前者,就对调他们的位置,否则不变
②接着比较第2个数和第3个数,如果后者>前者,就对调他们的位置,否则不变
③一直向下比较直到第n-1和第n个数比较完,第一轮结束。(这时候最大的数移动到了第n个数的位置)
④重复前三步,但是只比较到第n-1个数(将第二大的数移动到第n-1个数位置)
⑤持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
举个实例:5,4,3,2,1,对其进行冒泡排序,先是比较5跟4变成4,5,3,2,1,第一轮结束后变成43215,可以计算,当排序完成要经过4+3+2+1=10次比较,当然这是最复杂的情况,即完全反序。可以知道对于n个数,至多要经过1+2+...+n-1即(n^2-n)/2次比较才能排好序。这个式子里n的最高次阶是2,当n→∞时,一次阶对其比较次数影响很小,所以我们把这个算法的时间复杂度比作o()。
时间复杂度排序 o(1)<o()<o(lg)<o()<o()<o()(a>2,n表示输入的数据个数,o(1)为常数级别)
以冒泡排序为例,我们知道了,在排序这个大问题里,是可以找到一种时间复杂度为多项式o(n^2)的算法来求解排序问题的,所以说排序问题是一个有多项式时间算法的问题。
我们称,
(1)P类问题:存在多项式时间算法的问题。(P:polynominal,多项式)
题外话,为什么我们要研究这个?
当计算机处理的数据达到100万个的时候,时间复杂度为o(n^2)和o(e^n)的算法所需运行次数简直是天壤之别,o()指数级的可能运行好几天都没法完成,所以我们才要研究一个问题是否存在多项式时间算法。
而我们也只在乎一个问题是否存在多项式算法,因为一个时间复杂度比多项式算法还要复杂的算法研究起来是没有任何实际意义的。
好了,接下来我们介绍NP,先给定义,
(2)NP类问题:能在多项式时间内验证 得出一个正确解的问题。(NP:Nondeterministic polynominal,非确定性 多项式)
★我们不知道NP问题是否存在一个多项式时间的算法。(可能存在也可能不存在,我们不知道,不确定)
★P类问题是NP类问题的子集,因为存在多项式时间算法的问题,总能在多项式时间内验证它。
注意定义,这里是验证。
NP类问题俗话理解就是,不知道这个问题是不是存在多项式时间内的算法,所以叫non-deterministic非确定性,但是可以在多项式时间内验证并得出这个问题的一个正确解。举个例子,
著名的NP类问题:旅行家推销问题(TSP)。即有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的环路,这个环路路径小于a。
这个问题如果单纯的用枚举法来列举的话会有(n-1)!种,已经不是多项式时间的算法了,(注:阶乘算法比多项式的复杂)。那怎么办呢?我们可以用猜的,假设我人品好,猜几次就猜中了一条小于长度a的路径,我画画画画,好的,我得到了一条路径小于a的环路,问题解决了,皆大欢喜。可是,我不可能每次都猜的那么准,也许我要猜完所有种情况呢?所以这是一个NP类问题。我们能在多项式时间内验证并得出问题的一个正确解,可是我们却不知道该问题是否存在一个多项式时间的算法,每次都能解决他(注意,这里是不知道,不是不存在!)。
所以这就引出了这类讨论的一个
千年问题:是否NP类问题=P类问题?
即是否所有能在多项式时间内验证得出正确解的问题,都是存在多项式时间算法的问题?
太让人震惊了,要是解决了这个问题,那岂不是所有的NP问题都可以通过计算机来解决?
圣战的结果是:有的存在,有的不存在。
在这场圣战中,人们还发现了NPC问题和NPH问题。
为了证明这个千古难题,科学家想出了很多办法。办法之一:问题的约化。
问题约化:如果可以用问题B的算法来解决问题A ,就说问题A(简单)可以约化成问题B(复杂)。
例如一元一次方程的求解,跟二元一次方程的求解。只要能求解二元一次方程,那就可以用二元一次方程的解法来求解一元一次方程,只需将一元一次方程加上y,并附加一个方程y=0,然后用二元一次方程的解法来求解这个方程。注意,这里二元一次方程的解法会比一元一次的复杂。所以我们说,只需要找到解二元一次方程的规则性解法,那就能用这个规则性解法来求解一元一次方程。从这里可以看出,
约化是具有传递性的,如A约化到B,B约化到C,A就可以约化到C。
不断约化下去,我们会发现一个很惊人的特性,就是它一定会存在一个最大(较复杂)的问题,只要我们解决掉这个最大(较复杂)的问题,那其下所有问题(较简单)就都解决了!这就是我们所说的NPC问题的概念!!!
引到NP问题里就是,对于同一类的所有NP类问题,若他们都可以在多项式时间内约化成最难的一个NP类问题,(我们直观的认为,被约化成的问题具有比前一个问题更复杂的时间复杂度)要是能找到这个时间复杂度最高的超级NP问题的多项式时间算法,就等于变向证明了其下所有问题都存在多项式算法,即NP=P!!!!
给出NPC问题定义:
(3)NP完全问题(NPC问题):存在这样一个NP问题(较复杂),所有的NP问题(较简单)都可以约化成它(较复杂)。称这样一个NP问题(较复杂)为NPC问题。(complete 完全)
换句话说,只要解决了这个NPC问题(较复杂),那么所有(可约化成它)的NP问题(较简单)都能解决了。
★根据定义,NPC问题要满足2个条件:
①它是一个NP问题 ②所有的NP问题(较简单)都可以约化到它(较复杂)。
★证明一个问题是NPC问题的步骤:
①先证明它是一个NP问题 ②再证明一个已知的NPC问题能约化到它。
证明的步骤②中利用了约化的传递性:A约化到B,B约化到C,A就可以约化到C。
原理:如果所有的NP问题(较简单)【A】都可以约化成这个已知的NPC问题【B】,这个已知的NPC问题【B】又能约化成"待证明的问题"【C】
→ 所有的NP问题(较简单)【A】都可以约化成"待证明的问题"【C】
→满足NPC定义中的②
(4)NP难问题(NP-Hard问题):所有的NP问题(较简单)都能约化到它(较复杂),但它不一定是NP问题。
即它满足NPC问题定义的第二条但不一定要满足第一条。→NP-Hard问题要比 NPC问题的范围广,NP-Hard问题没有限定属于NP问题。
★NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。
以上四个问题之间的关系可以用下图来表示:
举例
NPC问题。
【NPC问题属于NP问题:能在多项式时间内验证并得出问题的一个正确解,但不知道是否存在一个多项式时间的算法 每次都能解决该问题(注意,这里是不知道,不是不存在!)。
1、SAT问题
2、0-1整数规划
3、最大团
判断图G中是否存在规模为K的团。
4、(SET PACKING)
判断集合族中是否存在l个两两不交的集合。
5、最小点覆盖
判断是否存在G中规模≤l的点集覆盖G中所有弧(E)
6、集合覆盖
7、反馈节点集
对有向图H和正整数k,问是否存在规模不超过k的V的子集C,s.t.对H中的任一圈,都有C中的点。
8、反馈弧集
对有向图H和正整数k,问是否存在规模不超过k的E的子集C,s.t.对H中的任一圈,都有C中的弧。
9、有向哈密尔顿回路
判断有向图H,有没有无重复遍历所有点的有向回路。
10、无向哈密尔顿回路
判断无向图G,有没有无重复遍历所有点的回路。
11、3SAT
12、图着色数
对图G,判断是否存在k染色,使相邻节点颜色相异。
13、分团覆盖
判断图G是否可分称不多于k个团。
14、恰好覆盖
判断是否存在子集族的一个子集是全集的分割。
15、(HITTING SET)
对U的子集族S,是否存在U的子集W,使得W与S中的每个集合的交集规模均为1.
16、斯坦纳树
对图G,V的子集R。w为G中的边的权重。求一个G的子树,包含R中所有点,且总权重不超过k。
17、(3-DIMENSIONALMATCHING)
判断T×T×T的子集U是否存在规模为|T|的子集W,其中元素在三个维度上的投影均不相同。
18、0-1背包
19、工作规划
有p个工作,每个工作有它要做的时间、DDL、和迟到惩罚三个参数,判断是否存在顺序使得总惩罚不超过K。
20、(PARTITION)判断s个正整数组成的集合是否可以分成和相等的两部分。
21、最大割
算法4类问题:P问题、NP问题、NP完全问题、NP难问题相关推荐
- Fisher算法+两类问题
文章目录 一.Fisher算法 二.蠓的分类问题: 三.代码实现: 一.Fisher算法 二.蠓的分类问题: 两种蠓Af和Apf已由生物学家根据它们的触角和翼长加以区分(Af是能传播花粉的益虫,Apf ...
- Java实现Google的S2算法工具类
WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...
- Cryptography,一个C#写的加解密算法的类
一个加解密算法的类,如下: Code using System; using System.IO; using System.Security.Cryptography; using System.T ...
- 商汤科技通用视觉部门招聘算法研究类岗位(校招/社招/实习生)
点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 商汤科技通用视觉部门校招/社招/实习生算法研究类岗位招聘 1.通用视觉部门介绍 商汤通用视觉部门是商汤超大规 ...
- 计算机 算法 ei 论文,计算机算法论文参考文献推荐 计算机算法专著类参考文献哪里找...
汇总了[100个]与计算机算法相关论文参考文献,为广大毕业生和职称者推荐计算机算法论文参考文献推荐,解决在校大学生不知个计算机算法专著类参考文献哪里找等相关问题! 一.计算机算法论文参考文献范文 [1 ...
- 国密算法java语言的实现:利用bcprov和hutool库分别实现国密SM4算法工具类,对称密钥
SM4算法成为行业标准: SM4分组密码算法是2012年3月21日实施的一项行业标准: 2021年6月25日,我国SM4分组密码算法作为国际标准ISO/IEC 18033-3:2010/AMD1:20 ...
- OpenCV4中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理、特点是什么,并附示例代码
关于OpenCV4中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,汇总如下: 上面的汇总不仅显示了OpenCV4中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,还显示了它们的继承. ...
- OpenCV3.0中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理、特点是什么,并附示例代码
关于OpenCV3中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,汇总如下: cv::Algorithm cv::BackgroundSubtractor cv::Backgro ...
- (数学)P、NP、NPC、NP hard问题
概念定义: http://m.elecfans.com/article/757041.html https://www.cnblogs.com/AndyJee/p/5048556.html P问题:能 ...
最新文章
- Centos6.5升级gcc for qt5.3.1
- vnc用户名 查看linux_linux 查看vnc服务器
- iis cgi 无法使用_ASP.NET Core前后端分离项目使用gitlabci持续集成到IIS
- win7配置计算机失败怎么办,电脑win7配置失败 还原更新 怎么处理 不要说重装
- C语言 课设 最新版 学生成绩管理系统
- 大数据?这些你了解吗?------之基础知识篇
- ITA结合测试(总结之六:ITA上的时间,与本地时间)
- STM32官方标准固件库下载及介绍
- 图像处理之调整对比度
- 原创|批处理实现安卓手机一键快速截屏
- 子图数正方形和长方形数量
- 莫比乌斯反演 平衡规划 双端栈 双端队列 等价类等
- 2019 ICPC西安邀请赛 游记
- win10 1607 密匙
- 固态硬盘文件恢复方法有哪些?四种恢复方法助您解忧
- 多家技术公司喊停的人脸识别业务,被这家波兰网站玩火了!
- 量化交易中,如何快速把股票代码转换成Int整形?
- web客户端页面连接MQTT服务
- vmstat 命令的用法说明
- 常用的国外遥感卫星网站
热门文章
- win7安装mysql5.7.16后,执行update语句导致mysql服务停止
- 去掉文本框默认特效边框样式
- ubuntu安装pytorch_geometric
- 学习使用php获取企业微信通讯录管理接口代码
- 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第五章:中级控件
- 【​观察】探访中国首家高端装备智能工厂 浪潮重新定义计算新未来
- 2010年上半年网络管理员上午试卷参考答案与解析
- python理解浮点数运算的误差_浮点数运算的机器误差分析
- 怎样用计算机写作业英语作文,小学英语作文万能句型+必背范文,孩子写作业一定用的到!...
- PHP自动打印到网络打印机?