P、NP、NPC问题详解
转载地址
https://blog.csdn.net/bcb5202/article/details/51202589
P、NP、NPC
概念
> P问题:能够在多项式时间内解决的决策问题。
—举例: 图搜索问题、最短路径问题、最小生成树问题······
> NP问题:不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时间验证的问题。
—验证:给定一个问题的实例、证书(类似于证据),需要验证这个证书是这个问题的正确答案。
— 举例:汉密尔顿路径,实例为G=(V,E),证书为顶点序列 {v0,v1,v2,v3,….,vk},我们的目的是要验证这个证书就是这个问题的答案,验证方法为:先遍历一遍这个点序列,看看是不是每个点只出现一次,然后对于(vi,vi+1)是否为G的边,这样就能够验证这个点序列是不是汉密尔顿路径,很显然这个验证过程是多项式时间的,所以汉密尔顿路径是NP问题。
> NPC问题:目前不能用多项式时间解决的问题,但是我们还不能证明这个问题不能用多项式时间解决,我们这次的目标是研究这个问题。
—满足的两个条件:是一个NP问题 + 所有的NP问题可以在多项式时间内规约到它
—举例:3SAT、顶点覆盖、团、三维匹配、汉密尔顿回路、划分问题·······
> NP难问题:所有的NP问题可以在多项式时间归约到它,但它不一定是一个NP问题
> 归约(约化)的标准概念: 如果能找到这样一个变化法则,对程序A的任意一个输入,都能按这个法则变换成程序B的输入,使这两个程序的输出相同,那么我们说,问题A可归约为问题B
— 问题A可以约化到问题B的含义是,可以用解决B的解法来解决A,或者说A可以“变成”B。
—A可归约为B的直观含义:B的时间复杂度>=A的时间复杂度。也即,A比B简单。
关系
P、NP、NPC、NP Hard问题的关系如下:
证明NPC问题
证明问题B是NPC问题的过程如下:
- 证明B是NP问题
- 知道一个已知的NPC问题A
- 证明A归约到B。
常见归约问题
基本知识
1、独立集 —— 在图G = (V,E)中,如果顶点集合S⊆V中的任意两点之间都没有边,则称S是独立的。
—难点: 寻找最大独立集。
—目标: 装入尽可能多的顶点,要求边涉及到的边服从一些限制条件。
2、顶点覆盖 —— 给定图G = (V,E),顶点集合S⊆V,如果图中的每一条边至少有一个端点在S中,则称S是一个顶点覆盖。
—难点: 寻找最小顶点覆盖。
—目标: 用尽可能少的顶点覆盖图中的所有边。
3、集合覆盖 —— 试图用一组较小的集合覆盖一个任意的对象集合。
常见问题
1、独立集问题——给定图G和数k,问是否包含大小至少为k的独立集?
2、顶点覆盖问题——给定图G和数k,问G是否包含大小至多为k的顶点覆盖?
3、集合覆盖问题——给定n个元素的集合U,U的子集S1,···,Sm以及数k,问在这些子集中有一组子集,它们的并等于整个U且至多包含k个子集吗?
4、集合包装问题——给定n个元素的集合U,U的子集S1,····,Sm以及数k,问在这些子集中至少有k个两两不相交吗?
5、SAT(可满足性问题)——给定bool变量集X={x1,···,xn}上的一组子句C1,···,Ck,问存在满足的真值赋值吗?
注意:每个子句均为析取子句(逻辑或∨),最终结果为各个子句的合取(逻辑与∧)。
6、3-SAT(三元可满足性问题)——给定bool变量集X={x1,···,xn}上的一组子句C1,···,Ck,每个子句的长为3,问存在满足的真值赋值吗?
注意:同上。
常用引理
设G=(V, E)是一个图,S⊆V,那么S是一个独立集当且仅当它的补V-S是一个顶点覆盖。
证明:首先,设S是一个独立集。考虑任一边e=(u,v),因为S是独立集,u和v不可能同时在S中,所以u和v至少有一个在V-S中,即得任一边至少有一个端点在V-S中,所以V-S是一个顶点覆盖。
反过来,设V-S是一个顶点覆盖,考虑S中的任意两个顶点u、v,若它们间有一条边e,那么e的两个端点均不在V-S中,这与假设V-S是一个顶点覆盖矛盾。所以S中的任意两点均无连线,所以S是一个独立集。
常见归约问题
归约的一般思想(要点):证明Y到X的归约,要用问题X中的分量构造“零件”来描写在问题Y中正在做的事
1、 独立集归约到顶点覆盖
证明:若有一个解顶点覆盖的黑盒子,那么通过问黑盒子G是否有大小至多为n-k的顶点覆盖,就能确定G是否有大小至少为k的独立集。
2、顶点覆盖归约到独立集
证明:若有一个可以解独立集的黑盒子,那么通过问黑盒子G是否有大小至少为n-k的独立集,就能确定G是否有大小至多为k的顶点覆盖。
3、顶点覆盖归约到集合覆盖
证明:若有一个可以解集合覆盖的黑盒子,考虑顶点覆盖的任一实例,给定图G=(V, E)和数k。
构造集合覆盖的一个实例,其基集U等于边E,对图G的每一个顶点i∈V,设Si⊆U为G中所有和点i相关联的边,把Si加入集合覆盖的实例中。
U能被集合S1,S2,···,Sn中的至多k个覆盖当且仅当G有大小至多为k的顶点覆盖。于是,给定顶点覆盖的实例,如上述的那样构造集合覆盖的实例,并把它输入黑盒子。回答yes当且仅当黑盒子回答yes。
4、独立集归约到集合包装
证明:若有一个解集合包装的黑盒子,考虑独立集的任一实例,给定图G=(V,E)和数k。
构造集合包装的一个实例,其基集U等于边E,对图G的每一个顶点i∈V,设Si⊆U为G中所有不和点i相关联的边,把Si加入集合包装的实例中。
U的子集S1,S2,···,Sn(实际是n个边集合)中至少k个两两不相交(即不存在相同边)当且仅当G有大小至少为k的独立集(此时k个顶点必不存在相连边),于是,给定独立集的实例,如上述的那样构造集合包装的实例,并把它输入黑盒子。回答yes当且仅当黑盒子回答yes。
5、3-SAT归约到独立集
证明:设有一个解独立集的黑盒子,要解3-SAT的实例,实例由变量集X={x1,····,xn}和子句C1,····,Ck组成。
考虑3-SAT的方法是:必须从每一个子句中选择一个项,然后找一组真值赋值使得所有找出来的项都为1,从而满足所有的子句。因此,如果如果没有两个被选中的项冲突,那么就成功了。
具体归约:用独立集描述3-SAT实例。首先,构造图G=(V,E),它由分成k个三角形的3k个顶点组成,如下图所示。对每一个子句i,构造3个顶点vi1,vi2,vi3。依据3-SAT实例子句在图中增加边描述冲突:在每一对标号对应冲突的项的顶点间添加一条边。
![]()
要证明原来的3-SAT是可满足的当且仅当构造出来的图G(依据3-SAT的实例子句构造)有大小至少为k的独立集。
>首先,若3-SAT是可满足的,那么构造出来的图G中的每个三角形至少包含一个标号的值为1的顶点。设S是每一个三角形中的一个这样的顶点组成的集合。设S不是一个独立集,则至少存在两个顶点u、v∈S间有一条边,则u、v一定是冲突(一个是1,另一个必是0)的,而S中的每个点值都为1,所以矛盾,所以假设不成立,即S是一个独立集。
>反过来,设图G有一个大小至少为k的独立集S。那么,当S的大小恰好为k,那么一定是由每个三角形的一个顶点组成,且S中的冲突顶点最多只能成单出现。所以显然可以设S中所有顶点对应的值全为1,且这些顶点每个对应于一个子句中选择的代表,所以此时对应的3-SAT实例存在真值赋值。
P、NP、NPC问题详解的更多相关文章
- P与NP问题详解
P,NP,NPC问题,这或许是众多OIer最大的误区之一. 本文就为大家详细讲解如上三个问题. 前序: 你会经常看到网上出现“这怎么做,这不是NP问题吗”.“这个只有搜了,这已经被证明是NP问题了”之 ...
- iOS 多线程之NSOperation篇举例详解
这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSBlockOperationClick,队列, ...
- 好用的wget命令从下载添加环境变量到各参数详解
本文是因为(笔者使用的windows系统)使用过好几次wget后,始终存在各种细节问题,于是下定决定细致的研究一下,并记录下其中细节. 下载与安装 第一步:下载wget,网络地址:http://dow ...
- JMeter学习-023-JMeter 命令行(非GUI)模式详解(一)-执行、输出结果及日志、简单分布执行脚本
前文 讲述了JMeter分布式运行脚本,以更好的达到预设的性能测试(并发)场景.同时,在前文的第一章节中也提到了 JMeter 命令行(非GUI)模式,那么此文就继续前文,针对 JMeter 的命令行 ...
- 【转发】NPAPI开发详解,Windows版
NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...
- AVL树详解
AVL树 参考了:http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html 修改了其中的错误,代码实现并亲自验证过. 平衡二叉树(B ...
- MySQL 索引详解大全
什么是索引? 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2. 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结 ...
- ASCII码详解
ASCII码详解 ASCII码表 ASCII码大致可以分作三部分組成.第一部分是:ASCII非打印控制字符: 第二部分是:ASCII打印字符: 第三部分是:扩展ASCII打印字符. 第一部分:ASCI ...
- GLSL-几何着色器详解跟实例(GS:Geometry Shader)[转]
[OpenGL4.0]GLSL-几何着色器详解和实例(GS:Geometry Shader) 一.什么是几何着色器(GS:Geometry Shader) Input Assembler(IA)从顶点 ...
随机推荐
- 掌握Redis分布式锁的正确姿势
本文中案例都会在上传到git上,请放心浏览 git地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/order-lock 本文会使用到 ...
- Arctic Code Vault Contributor 上榜了 go-admin v1.1 beta 版本发布
Arctic Code Vault Contributor 上榜了,内心比较喜悦,谢谢开源社区的支持,也谢谢广大 coder 的支持: go-admin 是一个基于 Gin + Vue + Eleme ...
- package.json中dependencies和devDependencies区别
package.json中dependencies和devDependencies区别 dependencies: 应用能够正常运行依赖的包.用户发布环境,依赖的包不仅开发环境能够使用,生产环境也能使 ...
- Selenium自动化:有代码测试与无代码测试。这些你都懂了吗?
大多数测试人员认为 Selenium是满足其测试自动化需求的自动化框架.作为全球测试人员使用的开放源框架, Selenium 无疑是测试人员适应日趋敏捷的公司的一种好方法.实际上, Selenium仍 ...
- 什么是CSV
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不 ...
- springboot项目部署到tomcat步骤以及常见问题
------------恢复内容开始------------ 本文分为两个部分,一,是打包的步骤,二,是我项目中所遇到的问题以及解决方法 一. 打包为war包步骤 1.修改打包方式为war 在pom. ...
- layui常用插件(二) 时间插件
日期和时间 html <div class="layui-inline"> <!-- 注意:这一层元素并不是必须的 --> <input type=& ...
- php 导出数据到excel类
原文链接地址:http://www.oschina.net/code/snippet_212240_21885 标注:在使用时一定要屏蔽掉//$bodyVal = $this->charset( ...
- Java语言概述_章节练习题及面试
学于尚硅谷开源课程 宋洪康老师主讲 感恩 尚硅谷官网:http://www.atguigu.com 尚硅谷b站:https://space.bilibili.com/302417610?from=se ...
- Django创建项目时应该要做的几件事
终于可以在假期开始学习 Django 啦 !