简析P和NP问题的概念
简析P和NP问题的概念
本文系作者学习笔记,内容均来源于网络,如有侵权,请联系删除
P类问题:所有能用多项式时间算法计算得到结果的问题,称为多项式问题,也就是P(polynomial)。
多项式时间举例:

NP类问题(Non-Deterministic Polynomial Problems):NP问题是指存在多项式算法能够验证的非决定性问题
NP概念的奥妙在于,它躲开了求解到底需要多少时间这样的问题,而仅仅只是强调验证需要多少时间
显然,P肯定是NP,因为你既然能用多项式求解,就肯定能用多项式验证(难不成我再算一遍就好了嘛!)
所以,一个问题很有可能同时是P类问题,也是NP类问题(因为P问题就是NP问题的子集啊)
NP完全(NP Complete)问题,也叫做NPC问题:一个属于NP类的问题,但目前为止没办法在P时间内解决(也就是说目前只能在P时间内判断解的正确性)
- 一个经典的NP完全问题:3-SAT问题

是否存在一种组合,使得结果最终等于True
需要注意的是,所有的NP完全问题是可以互相转换的。
- 一个经典的NP完全问题:完全图问题:
从图中找到k个节点组成的完全子图。也是只能在多项式时间内验证,目前还没办法证明。
拿到这个问题之后,我们可以试着将这个问题转换为3-SAT问题,这样就能说明它就是NP完全问题了(就可能偷懒不去试着解决问题了23333)

图中这个符号表示3-SAT问题可以在多项式时间内转换为CLIQUE问题(也就是我们所说的完全图问题),当然谁转谁都行的····
- 这里所用的3-SAT问题场景

下面节点的颜色代表括号的分组
- 将每个点连接到其他组中除了和自己相反的变量之外所有的变量,自己组内的也不连

- 设置k等于3-SAT问题中括号的数量
如果这里能找到这样一个有k个节点的回路,就表示上面的3-SAT问题是有解的。

如图,只要把X2\X4\X3设为True,则原3-SAT问题有解为什么这种方式是合理的呢?因为原来的3-SAT问题最核心的问题所在就是设置变量为True时会导致这个变量的反值为False,这样就有可能造成某一个括号中为False。而由于我们在连接各个节点时没有连接1. 本身集合中的值2.该变量的反值。使得连接成的回路中的节点一定是来自不同的集合中且不会同时存在某一个变量和其反值的。那么将这样的回路中的节点值设为True就一定能解决问题了。
目前没有解决的命题:P是否等于NP,也就是是否存在一个问题,只能用P时间检验,不能用P时间求解。目前大家倾向于P不等于NP,但是并没有证明出来
NP难问题(NP-hardness problem):如果所有NP问题都可以多项式时间归约到某个问题,则称该问题为NP困难。
NP难问题的特征是至少和NP问题一样难
这里涉及一个概念,不妨称为问题之间的归约。可以认为各个问题的难度是不同的,表现形式为,如果我可以把问题A中的一个实例转化为问题B中的一个实例,然后通过解决问题B间接解决问题A,那么就认为B比A更难。
通过对归约过程做出限制可以得到不同类型的归约。复杂度理论里经常用到的规约叫polynomial-time Karp' reduction。其要求是转化问题的过程必须是多项式时间内可计算的。
称问题L是NP-hard,如果任意一个NP的问题都可以多项式规约到L。如果一个NP-hard的问题L本身就是NP的,则称L是NP-complete。这个定义可以推广到所有复杂度类。所以NPcompleness的直观解释就是,我能解决这个问题就相当于具备了用相同级别的计算资源解决这个复杂度类里所有问题的能力。
一个NP问题可以在多项式时间内规约到问题L中,说明L的难度是要高于原问题的,由于是“任意一个NP问题都可以规约”,所以说L的难度是不低于所有NP问题的。而如果这个L依然是NP问题,而不是连NP的程度都达不到的话,我们就可以说它应该是NP中最难的那一种了,也就是NP完全问题了。由于NP完全问题算是NP问题中最难的那一种了,而且搁目前也没办法在P时间内解决,所以可以说NP完全问题之间的难度是一样的了,NP完全问题之间可以互相转化也验证了这一点。
Reference
- https://blog.csdn.net/bitcarmanlee/article/details/51935400
- https://www.bilibili.com/video/av16446193?from=search&seid=1193870537063836496
- http://www.voidcn.com/article/p-yfvjdvmq-nh.html
简析P和NP问题的概念的更多相关文章
- SpringMVC学习(一)——概念、流程图、源码简析
学习资料:开涛的<跟我学SpringMVC.pdf> 众所周知,springMVC是比较常用的web框架,通常整合spring使用.这里抛开spring,单纯的对springMVC做一下总 ...
- Java Android 注解(Annotation) 及几个常用开源项目注解原理简析
不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
- 简析TCP的三次握手与四次分手【转】
转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...
- 简析 __init__、__new__、__call__ 方法
简析 __init__.__new__.__call__ 方法 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使 用.垃圾回收,不同的 ...
- SIFT特征原理简析(HELU版)
SIFT(Scale-Invariant Feature Transform)是一种具有尺度不变性和光照不变性的特征描述子,也同时是一套特征提取的理论,首次由D. G. Lowe于2004年以< ...
- TCP/UDP,SOCKET,HTTP,FTP 简析
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...
- Linux内存管理机制简析
Linux内存管理机制简析 本文对Linux内存管理机制做一个简单的分析,试图让你快速理解Linux一些内存管理的概念并有效的利用一些管理方法. NUMA Linux 2.6开始支持NUMA( Non ...
- ASCII、Unicode、UTF-8、UTF-16、GBK、GB2312、ANSI等编码方式简析
ASCII.Unicode.UTF-8.UTF-16.GBK.GB2312.ANSI等编码方式简析 序言 从各种字节编码方法中,能看到那个计算机发展的洪荒时期的影子. ASCII ASCII码有标准A ...
随机推荐
- sklearn4_混合分类器
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- Shutdown 源码阅读
Shutdown /** * 虚拟机关闭步骤 * @since 1.3 */ class Shutdown { /* 关闭状态 */ private static final int RUNNING ...
- Torvalds的linux
1991年,芬兰人林纳斯•托瓦兹在赫尔辛基大学上学,对操作系统很好奇,并且对MINIX只允许在教育上使用很不满(其不允许任何商业使用),于是开始写他自己的操作系统,这就是后来的Linux内核. 199 ...
- shell做成csv文件
echo a,b,c,d >aa.csv 其实就是用逗号做分隔符
- flutter shared_preferences 异步变同步
前言 在开发原生iOS或Native应用时,一般有判断上一次安装的版本和当前版本是否是同一个版本,如果不是同一个版本,则要显示引导页,这个过程是把版本号持久化存储起来,在每一次启动时进行判断,这个过程 ...
- WPF/ASP.NET:几个Prism中的术语
Prism 棱镜 Bootstrapper 启动器 dependency injection 依赖注入 regions 区域 navigation 导航 shell 壳
- firefox浏览器插件---网址优化
安装:YSlow插件 之后还必须安装firebug.否则YSlow不能使用. 安装:firebug 下面就可以了
- 判断对象当中有没有某一个属性(AS,JS,Java语言比较)
1.AS 首先说说AS里面如何判断,AS现在很少用这个语言了,当时我们公司的项目当中还有,所以就拿出来一块比较一下,代码如下: //利用Object属性判断 if("name" i ...
- Ubuntu16版本中安装MongoDB
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux/ //授权 https://docs.mongodb.com/man ...
- 将json文件转化为可视化
利用python转化为可视化: python -mjson.tool