简析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 ...
随机推荐
- 2018-2019-2 20165215《网络对抗技术》Exp9 :Web安全基础
目录 实验目的及内容 实验过程记录 一.Webgoat安装 二. 注入缺陷(Injection Flaws) (一)命令注入(Command Injection) (二)数字型注入(Numeric S ...
- ios修改UIIMage大小
/** * 改变图片的大小 * * @param img 需要改变的图片 * @param newsize 新图片的大小 * * @return 返回修改后的新图片 */ - (UIImage *)s ...
- Oracle 中使用正则表达式
Oracle使用正则表达式离不开这4个函数: 1.regexp_like select t3.cert_no from table_name t3 where regexp_like(t3.cert_ ...
- docker批量删除容器、镜像(转载)
1.删除所有容器 docker rm `docker ps -a -q` 2.删除所有镜像 docker rmi `docker images -q` 3.按条件删除镜像 没有打标签 docker r ...
- Django FBV CBV以及使用django提供的API接口
FBV 和 CBV 使用哪一种方式都可以,根据自己的情况进行选择 看看FBV的代码 URL的写法: from django.conf.urls import url from api import v ...
- Python中针对函数处理的特殊方法
Python中针对函数处理的特殊方法 很多语言都提供了对参数或变量进行处理的机制,作为灵活的Python,提供了一些针对函数处理的特殊方法 filter(function, sequence):对se ...
- AE调用GP工具(创建缓冲区和相交为例)
引用 Geoprocessing是ArcGIS提供的一个非常实用的工具,借由Geoprocessing工具可以方便的调用ArcToolBox中提供的各类工具,本文在ArcEngine9.2平台环境下总 ...
- python基础之数据类型转换
方法转换:str -->list str.split() list -->str ''.join(list)强制转换:str -->list list(str) str --> ...
- webdriervAPI(窗口截图)
from selenium import webdriver driver = webdriver.Chorme() driver.get("http://www.baidu.co ...
- NoSQL--leveldb
什么是leveldb: leveldb它是一个 NOSQL 存储引擎,它和 Redis 不是一个概念.Redis 是一个完备的数据库,而 LevelDB 它只是一个引擎. LevelDB 还可以将它看 ...