简析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. js对象之间的"继承"的五种方法

    今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = & ...

  2. ILSpy C# language support status

    C# language support status Asynchronous methods 已经支持 Generalized async return types  还不支持 Async main ...

  3. Cortex-M3 咬尾中断 与 晚到中断

    [咬尾中断]在处理器在响应某些异常时,如果又发生其他异常,但它们优先级不够高,则它们会被阻塞. 那么,在当前的异常执行返回后,系统处理悬起的异常时,倘若还是先POP,然后又把POP处理的内容PUSH回 ...

  4. LC 537. Complex Number Multiplication

    Given two strings representing two complex numbers. You need to return a string representing their m ...

  5. LC 861. Score After Flipping Matrix

    We have a two dimensional matrix A where each value is 0 or 1. A move consists of choosing any row o ...

  6. Session技术入门代码案例

    package com.loaderman.demo; import javax.servlet.ServletException; import javax.servlet.http.*; impo ...

  7. xaml中显示 “大括号左边” 文本

    Content="{}{" 最合适的还是上面的写法 转义符{不好使的 要么 空格{ 要么 全角{ 要么binding

  8. python基础知识(元组)

    元组 不能更改内容 元组 (元素1,元素2) 元组的创建和删除 使用赋值运算符直接创建元组 元组名 = (元素1,元素2........) 只创建一个元素的元组    元组名 = (元素1,) 创建空 ...

  9. LeetCode.1128-等价多米诺骨牌对的数量(Number of Equivalent Domino Pairs)

    这是小川的第394次更新,第428篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第259题(顺位题号是1128).给定多米诺骨牌列表,当且仅当(a == c且b == d ...

  10. centos7/redhat7安装mycli

    一.mycli介绍 MySQL的命令行客户端,可以执行自动完成和语法突出显示. 主页:http://mycli.net文档:http://mycli.net/docs github:https://g ...