简析P和NP问题的概念

本文系作者学习笔记,内容均来源于网络,如有侵权,请联系删除

  1. P类问题:所有能用多项式时间算法计算得到结果的问题,称为多项式问题,也就是P(polynomial)。

    多项式时间举例:

  2. NP类问题(Non-Deterministic Polynomial Problems):NP问题是指存在多项式算法能够验证的非决定性问题

    NP概念的奥妙在于,它躲开了求解到底需要多少时间这样的问题,而仅仅只是强调验证需要多少时间

    显然,P肯定是NP,因为你既然能用多项式求解,就肯定能用多项式验证(难不成我再算一遍就好了嘛!)

    所以,一个问题很有可能同时是P类问题,也是NP类问题(因为P问题就是NP问题的子集啊)

  3. NP完全(NP Complete)问题,也叫做NPC问题:一个属于NP类的问题,但目前为止没办法在P时间内解决(也就是说目前只能在P时间内判断解的正确性)

    • 一个经典的NP完全问题:3-SAT问题

是否存在一种组合,使得结果最终等于True

需要注意的是,所有的NP完全问题是可以互相转换的

  • 一个经典的NP完全问题:完全图问题:

从图中找到k个节点组成的完全子图。也是只能在多项式时间内验证,目前还没办法证明。

拿到这个问题之后,我们可以试着将这个问题转换为3-SAT问题,这样就能说明它就是NP完全问题了(就可能偷懒不去试着解决问题了23333)

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

  1. 这里所用的3-SAT问题场景

下面节点的颜色代表括号的分组

  1. 将每个点连接到其他组中除了和自己相反的变量之外所有的变量,自己组内的也不连

  1. 设置k等于3-SAT问题中括号的数量

如果这里能找到这样一个有k个节点的回路,就表示上面的3-SAT问题是有解的。

如图,只要把X2\X4\X3设为True,则原3-SAT问题有解为什么这种方式是合理的呢?因为原来的3-SAT问题最核心的问题所在就是设置变量为True时会导致这个变量的反值为False,这样就有可能造成某一个括号中为False。而由于我们在连接各个节点时没有连接1. 本身集合中的值2.该变量的反值。使得连接成的回路中的节点一定是来自不同的集合中且不会同时存在某一个变量和其反值的。那么将这样的回路中的节点值设为True就一定能解决问题了。

  1. 目前没有解决的命题:P是否等于NP,也就是是否存在一个问题,只能用P时间检验,不能用P时间求解。目前大家倾向于P不等于NP,但是并没有证明出来

  2. 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

  1. https://blog.csdn.net/bitcarmanlee/article/details/51935400
  2. https://www.bilibili.com/video/av16446193?from=search&seid=1193870537063836496
  3. http://www.voidcn.com/article/p-yfvjdvmq-nh.html

简析P和NP问题的概念的更多相关文章

  1. SpringMVC学习(一)——概念、流程图、源码简析

    学习资料:开涛的<跟我学SpringMVC.pdf> 众所周知,springMVC是比较常用的web框架,通常整合spring使用.这里抛开spring,单纯的对springMVC做一下总 ...

  2. Java Android 注解(Annotation) 及几个常用开源项目注解原理简析

    不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...

  3. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  4. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...

  5. 简析 __init__、__new__、__call__ 方法

    简析 __init__.__new__.__call__ 方法 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使 用.垃圾回收,不同的 ...

  6. SIFT特征原理简析(HELU版)

    SIFT(Scale-Invariant Feature Transform)是一种具有尺度不变性和光照不变性的特征描述子,也同时是一套特征提取的理论,首次由D. G. Lowe于2004年以< ...

  7. TCP/UDP,SOCKET,HTTP,FTP 简析

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  8. Linux内存管理机制简析

    Linux内存管理机制简析 本文对Linux内存管理机制做一个简单的分析,试图让你快速理解Linux一些内存管理的概念并有效的利用一些管理方法. NUMA Linux 2.6开始支持NUMA( Non ...

  9. ASCII、Unicode、UTF-8、UTF-16、GBK、GB2312、ANSI等编码方式简析

    ASCII.Unicode.UTF-8.UTF-16.GBK.GB2312.ANSI等编码方式简析 序言 从各种字节编码方法中,能看到那个计算机发展的洪荒时期的影子. ASCII ASCII码有标准A ...

随机推荐

  1. Java如何对一个对象进行深拷贝?

    在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝.浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化.而深拷贝则是拷贝了源对象的所有值,所以即 ...

  2. Thymeleaf Multiple Template Locations using Spring Boot

    1. Overview In this tutorial, we'll see how we can define multiple template locations using Thymelea ...

  3. This sample is for changing from “float64” to “int” for values did unmarshal using map[string]interface{}. When it did unmarshal using map[string]interface{}, a number with “int” was changed to “floa

    This sample is for changing from “float64” to “int” for values did unmarshal using map[string]interf ...

  4. ipv4 ipv6 求字符串和整数一一映射的算法 AmazonOrderId

    字符串和整数一一映射的算法 公司每人的英文名不同,现在给每个英文名一个不同的数字编号,怎么设计? 走ipv4/6  2/32 2/128就够了,把“网段”概念对应到“表或库”,ip有a_e5类,这概念 ...

  5. LC 465. Optimal Account Balancing 【lock,hard】

    A group of friends went on holiday and sometimes lent each other money. For example, Alice paid for ...

  6. 提升键盘可访问性和AT可访问性

    概述 很多地方比如官网中需要提升 html 的可访问性,我参考 element-ui,总结了一套提升可访问性的方案,记录下来,供以后开发时参考,相信对其他人也有用. 可访问性 可访问性基本上分为 2 ...

  7. GMM-EM实验结果

  8. 有效使用Django的QuerySets

    对象关系映射 (ORM) 使得与SQL数据库交互更为简单,不过也被认为效率不高,比原始的SQL要慢. 要有效的使用ORM,意味着需要多少要明白它是如何查询数据库的.本文我将重点介绍如何有效使用 Dja ...

  9. Docker学习笔记 — Docker私有仓库搭建

    Docker学习笔记 — Docker私有仓库搭建   目录(?)[-] 环境准备 搭建私有仓库 测试 管理仓库中的镜像 查询 删除 Registry V2   和Mavan的管理一样,Dockers ...

  10. java:svn

    1.配置: 在windows系统中,操作svn的工具最长用的是小乌龟svn 服务器端(项目所在的服务器上):在java开发中几乎所有的服务器为Linux系统 需要在Linux系统中进行安装 1.修改h ...