算法分析与设计——规约和NPC问题
一、多项式规约
1、概念及性质
\quad多项式时间归约:如果问题X和问题Y满足以下两条性质,那么问题X可以在多项式时间归约到问题Y。
- 问题X可以通过多项式时间的基本运算步骤转换为问题Y;
- 问题X多项式次调用求解问题Y的算法
记为X≤PYX\le_{P}YX≤PY。三点性质: - 若X≤PYX\le_{P}YX≤PY,YYY能在多项式时间内求解,则XXX也能在多项式时间内求解
- 若X≤PYX\le_{P}YX≤PY,XXX不能在多项式时间内求解,则YYY也不能在多项式内求解
- 若X≤PYX\le_{P}YX≤PY且Y≤PXY\le_{P}XY≤PX,则X,YX,YX,Y多项式等价,记为X≡PYX ≡_{P} YX≡PY。X,YX,YX,Y中一方能在多项式时间内求解则另一方也能在多项式时间内求解。
2、点独立集和点覆盖
\quad点独立集:在图GGG中选出若干个顶点,这些顶点之间没有边相连接,称为点独立集。一个图中所有点独立集中点数最多的集合称为图的最大点独立集。
\quad点覆盖:在图GGG中选出若干个顶点组成集合SSS,使得图中每一条边的两个顶点都至少有一个顶点在SSS中,则集合SSS称为图的点覆盖集。一个图中所有的点覆盖集中点数最少的集合称为图的最小点覆盖。
证明:点独立集≡P点覆盖点独立集 ≡_{P}点覆盖点独立集≡P点覆盖
\quad由SSS是点独立集证明V−SV-SV−S是点覆盖
\quad证明:设SSS是大小为kkk的点独立集。则对于图中的任意一条边(u,v)∈E(u,v)\in E(u,v)∈E,因为SSS是点独立集,故u,vu,vu,v不能全在SSS中,即u,vu,vu,v至少有一个在V−SV-SV−S中。因此,集合V−SV-SV−S能保证对于图中每一条边,该边都至少有一个顶点在V−SV-SV−S中,V−SV-SV−S是图的点覆盖。
\quad由V−SV-SV−S是点覆盖证明SSS是点独立集
\quad证明:设V−SV-SV−S是大小为n−kn-kn−k的点覆盖。则对于图中的任意一条边(u,v)∈E(u,v)\in E(u,v)∈E,(u,v)(u,v)(u,v)至少有一个顶点在V−SV-SV−S中,故在SSS中,(u,v)(u,v)(u,v)最多有一个顶点在SSS中。因此,SSS是图的点独立集。
\quad综上,点独立集≡P点覆盖点独立集 ≡_{P}点覆盖点独立集≡P点覆盖。
3、集合覆盖问题和顶点覆盖问题
\quad问题说明:给定一个集合UUU和若干UUU的子集合SnS_nSn,问能否在SnS_nSn中找出kkk个集合,使得这kkk个集合的并为UUU。如下图所示,
集合Sc.SfS_c.S_fSc.Sf的并为集合UUU。
\quad定义了集合覆盖问题,我们可以将顶点覆盖问题规约到这个问题上去。即证明顶点覆盖≤P集合覆盖顶点覆盖 \le_{P} 集合覆盖顶点覆盖≤P集合覆盖。证明这个问题只需证明对于每一个给定的顶点覆盖问题都可以在集合覆盖问题中找到对应的实例,证明二者等价即可,难点在于构造对应的实例。这个问题的证明可以通过如下构造来完成:
- 顶点覆盖问题即为对于给定的图G=(V,E)G=(V,E)G=(V,E),能否找到kkk个点,使得图中每条边都至少有一个点在这kkk个点中。
- 对于顶点问题做如下转化:给定一个集合UUU,UUU中元素为图中的每条边。对于图中每个顶点iii,我们都建立一个集合SiS_iSi,SiS_iSi中元素为与顶点iii相连的边。这样,问题就转化成了在集合SSS中能否找到kkk个集合,使得这些集合的并为UUU。
- 举个例子,下图是一个6个顶点,7条边的图。对于左边的图而言,当k=2k=2k=2时,c,f{c,f}c,f为图的点覆盖;对于右边转化后的集合而言,Sc,SfS_c,S_fSc,Sf的并集为UUU。
\quad这样,就证明了顶点覆盖 可以多项式规约到集合覆盖。但集合覆盖问题能多项式规约到顶点覆盖问题吗?答案是否定的,因为对于任意的集合SiS_iSi而言,每个元素出现次数可能不是偶数,对于图而言,每条边出现次数一定是偶数,故这种情况下无法通过构图来表示任意一种集合,因此集合覆盖无法规约到顶点覆盖。
4、可满足性问题(SAT)和3-SAT
\quad可满足性问题定义:对于给定的由二元bool变量构成的表达式,例如Φ=C1∧C2∧C3∧C4,Ci=x1∨x2‾∨x3\Phi=C_1\wedge C_2 \wedge C_3 \wedge C_4,C_i=x_1\vee \overline{x_2} \vee x_3Φ=C1∧C2∧C3∧C4,Ci=x1∨x2∨x3。xix_ixi为bool变量,目的是求解合适的xix_ixi的值,使得Φ=true\Phi=trueΦ=true。∧\wedge∧表示“与”,∨\vee∨表示"并",x‾\overline{x}x表示xxx的非。由此可知,要使得Φ=true\Phi=trueΦ=true,那么每个Ci=trueC_i=trueCi=true,进而得到每个CiC_iCi中二元变量xix_ixi至少有一个为truetruetrue。
\quad 3-SAT:当每个CiC_iCi包含3个bool变量时构成的逻辑表达式Φ\PhiΦ,并求解各个bool变量使得Φ=true\Phi=trueΦ=true的问题称为3-SAT问题。如下图即为一个3-SAT问题及其的一个解。
证明:3−SAT≤P点独立集问题3-SAT\le_{P}点独立集问题3−SAT≤P点独立集问题
\quad只需证明对于每一个给定的3-SAT问题,都能给出一个对应的图GGG的实例,使得这个图有大小为kkk的点独立集。
构造图的方法如下:
- 对于Φ\PhiΦ中每一个CiC_iCi,都用三个顶点代表CiC_iCi中每个变量,并用边将这三个顶点两两连接
- 对于某个变量和该变量的取反,用边连接起来,表示这两个变量所对应的顶点不能在一个点独立集中
定理:Φ=true\Phi=trueΦ=true等价于GGG有大小为k=∣Φ∣k=|\Phi|k=∣Φ∣的点独立集。
证明:若Φ=true\Phi=trueΦ=true,则GGG的每一个三个顶点构成的团里至少有一个顶点是点独立集中的一员,故GGG有大小为k=∣Φ∣k=|\Phi|k=∣Φ∣的点独立集。若GGG的每一个三个顶点构成的团里至少有一个顶点是点独立集中的一员,则每个Φ\PhiΦ中的每个CiC_iCi至少一个变量为truetruetrue,即每个Ci=trueC_i=trueCi=true,进而Φ=true\Phi=trueΦ=true。
5、自规约问题
\quad可自规约问题指的是该问题的优化问题可以多项式规约到该问题的决策问题的这一类问题。比如图的最小顶点覆盖问题可以多项式规约到图是否有小于kkk个顶点的顶点覆盖。证明如下:
- 从1开始,依次查找该图有没有k∗k^*k∗个顶点的顶点覆盖(这样得到的第一次满足的k∗k^*k∗的值就是该图最小顶点覆盖的数目)
- 从图中选出一个点vvv,若去除该点后图的顶点覆盖数目变为k∗−1k^*-1k∗−1,则vvv是原图顶点覆盖中的一员,反之则不是
- 在G−vG-{v}G−v中递归执行上述两步。
6、规约问题总结
\quad规约的传递性:若X≤PY,Y≤PZX\le_{P}Y,Y\le_{P}ZX≤PY,Y≤PZ,则X≤PZX\le_{P}ZX≤PZ。
\quad对上面规约问题做一个总结,我们已经证明了以下规约问题:
- 点独立集问题≡P顶点覆盖问题点独立集问题≡_{P}顶点覆盖问题点独立集问题≡P顶点覆盖问题
- 顶点覆盖问题≤P集合覆盖问题顶点覆盖问题\le_{P}集合覆盖问题顶点覆盖问题≤P集合覆盖问题
- 3−SAT≤P点独立集问题3-SAT\le_{P}点独立集问题3−SAT≤P点独立集问题
- 3−SAT≤P点独立集问题≤P顶点覆盖问题≤P集合覆盖问题3-SAT\le_{P}点独立集问题\le_{P}顶点覆盖问题\le_{P}集合覆盖问题3−SAT≤P点独立集问题≤P顶点覆盖问题≤P集合覆盖问题
- 某个大佬证明了3−SAT3-SAT3−SAT问题是NPC问题,因此上诉所有问题均为NPC问题
二、P,NP和NPC问题
1、P问题
\quad能在多项式时间内解决的问题称为P问题。比如:素数问题。
素数问题:任意给定一个数字sss,求sss是否是素数的算法。AKS素数测试(又被称为 Agrawal–Kayal–Saxena素数测试 和 Cyclotomic AKS test)是一个决定型素数测试算法 ,由三个来自印度坎普尔理工学院的计算机科学家,Manindra Agrawal、Neeraj Kayal和Nitin Saxena,在2002年8月6日发表于一篇题为素数属于P的论文。
2、NP问题
\quad能在多项式时间内验证的问题称为NP问题。比如:对于3-SAT问题,给出其中一个解法,让你判断这个解法是否是原问题的一个解。可见所有的P问题都可以在多项式时间内去验证,因此,P问题是NP问题的子集。
3、EXP问题
\quad能在指数时间复杂度内解决的问题。NP问题是EXP问题的子集。
4、普遍认为P≠NPP\neq NPP=NP
\quad目前还不能证明P=NPP=NPP=NP或者P≠NPP \neq NPP=NP。
5、NPC问题
\quad找出一个已被证明的NPC问题(SAT),所有能规约到这个NPC问题的问题统称为NPC问题。
\quad定理:若XXX是NPC问题,YYY是NP问题,X≤PYX \le_{P} YX≤PY,则YYY是NPC问题。
6、证明一个问题Y是NPC问题
- 证明Y是NP问题
- 找一个已知的NPC问题X,证明X≤PYX\le_{P}YX≤PY,则Y是NPC问题
\quad这几个大佬证明了下列常见问题可以多项式相互归约,因为cook证明了SAT问题是NPC问题,又由于归约的传递性,可得下列问题均为NPC问题。
7、一些有趣的tips
\quad大部分NP问题不是P问题就是NPC问题,但有些NP问题既不是P问题也不是NPC问题,例如(因子分解,同构图等)。Lader在1975年证明了在P≠NPP\neq NPP=NP的条件下,一定会存在某些NP问题既不是P问题也不是NPC问题。
三、经典的NPC问题
1、序列问题
\quad在之前,我们已经证明了上图中最左边那一条线,现在我们要证明第二条路,即3−SAT≤P有向图的Hamilton圈≤P无向图的Hamilton圈≤PTSP问题3-SAT \le_{P} 有向图的Hamilton圈 \le_{P} 无向图的Hamilton圈 \le_{P} TSP问题3−SAT≤P有向图的Hamilton圈≤P无向图的Hamilton圈≤PTSP问题。
\quad哈密尔顿圈:对于给定的图GGG,问是否存在一条路,使得经过图GGG所有顶点并且每个顶点只经过一次。
证明:有向图的Hamilton圈≤P无向图的Hamilton圈有向图的Hamilton圈 \le_{P} 无向图的Hamilton圈有向图的Hamilton圈≤P无向图的Hamilton圈
step1:根据任意一个有向图GGG,创建对应的无向图实例G′G'G′。创建方法如下:
step2:正向证明。假设GGG中有Hamilton圈,则G′G'G′中也有Hamilton圈
step3:反向证明。假设G′G'G′中有Hamilton圈,则该Hamilton圈有两种序列模式:黑白绿黑白绿…;黑绿白黑绿白…。这两种模式中黑色顶点顺序对应原图Hamilton圈的正序或者逆序,因此GGG也有Hamilton圈。
证明:3−SAT≤P有向图的Hamilton圈3-SAT \le_{P} 有向图的Hamilton圈3−SAT≤P有向图的Hamilton圈
\quad证明太难暂且放过。
证明:无向图的Hamilton圈≤PTSP问题无向图的Hamilton圈 \le_{P} TSP问题无向图的Hamilton圈≤PTSP问题
step1:构造实例。对于图G=(V,E)G=(V,E)G=(V,E),创建n=∣V∣n=|V|n=∣V∣个顶点的图G′G'G′,G′G'G′中两两边之间的权重d(u,v)d(u,v)d(u,v)如下:
- 若(u,v)∈E(u,v)\in E(u,v)∈E,则d(u,v)=1d(u,v)=1d(u,v)=1
- 若(u,v)∉E(u,v)\notin E(u,v)∈/E,则d(u,v)=2d(u,v)=2d(u,v)=2
step2:正向证明。如果GGG中有Hamilton圈,则该圈即为G′G'G′中的TSP路径。
step3:反向证明。如果G′G'G′中有TSP路径,则该路径长度为n,该路径即为GGG的Hamilton圈。
2、图着色问题
\quad这是上图第三条路线的证明,包括3−SAT≤P图三点着色≤P平面图的三点着色3-SAT \le_{P} 图三点着色 \le_{P}平面图的三点着色3−SAT≤P图三点着色≤P平面图的三点着色。
证明:3−SAT≤P图三点着色3-SAT \le_{P} 图三点着色3−SAT≤P图三点着色
\quad此证明太难直接放弃
3、数字问题
\quad上图中最右边那条线的证明,包括3−SAT≤P子数组和≤P调度问题3-SAT\le_{P}子数组和\le_{P}调度问题3−SAT≤P子数组和≤P调度问题
证明:3−SAT≤P子数组和3-SAT\le_{P}子数组和3−SAT≤P子数组和
\quad子数组和问题:给出一个有n个数的数组{w1,w2,⋯,wn}\{w_1,w_2,\cdots,w_n\}{w1,w2,⋯,wn}和一个数WWW,问存不存在该数组的子数组使得子数组和为WWW。
证明:子数组和问题≤PPartition问题子数组和问题\le_{P}Partition问题子数组和问题≤PPartition问题
\quadPartition问题:给出mmm个数{v1,v2,⋯,vm}\{v_1,v_2,\cdots,v_m\}{v1,v2,⋯,vm},能将这些数划分为两个子集,使得这两个子集中数的和相同。
- 构造实例:给出子数组和实例{w1,w2,⋯,wn}\{w_1,w_2,\cdots,w_n\}{w1,w2,⋯,wn}和其相加的目标WWW,我们可以这样构造Partition的实例:Partition实例包含n=m+2n=m+2n=m+2个元素,v1=w1,⋯,vn=wn,vn+1=2∑i(wi)−W,vn+2=∑i(wi)+Wv_1=w_1,\cdots,v_n=w_n,v_{n+1}=2\sum_i(w_i)-W,v_{n+2}=\sum_i(w_i)+Wv1=w1,⋯,vn=wn,vn+1=2∑i(wi)−W,vn+2=∑i(wi)+W。
- 正向证明:若子数组和问题中存在某个子数组subsetA的和为WWW,则另一个数组subsetB和为∑i(wi)−W\sum_i(w_i)-W∑i(wi)−W。subsetA+vn+1=2∑i(wi)=subsetB+vn+2subsetA+v_{n+1}=2\sum_i(w_i)=subsetB+v_{n+2}subsetA+vn+1=2∑i(wi)=subsetB+vn+2,故而Partition问题得到解决。
- 反向证明:若Partition问题实例能分为两个和相等的子集subsetA,subsetBsubsetA,subsetBsubsetA,subsetB,则vn+1v_{n+1}vn+1和vn+2v_{n+2}vn+2一定分属于这两个子集,故而subsetA−vn+1=WsubsetA-v_{n+1}=WsubsetA−vn+1=W为原子数组和问题的解。
证明:子数组和问题≤P调度问题子数组和问题\le_{P}调度问题子数组和问题≤P调度问题
\quad调度问题:给出n个任务,每个任务jjj包含可以开始处理的时间rjr_jrj,处理任务所需时间tjt_jtj,任务的截至时间djd_jdj。这些任务在一个机器上运行,且每个任务必须在连续的tjt_jtj时间内运行,问是否存在一种安排方式使得这些任务都能在[rj,dj][r_j,d_j][rj,dj]时间内完成。
- 构造实例:给出子数组和实例{w1,w2,⋯,wn}\{w_1,w_2,\cdots,w_n\}{w1,w2,⋯,wn}和其相加的目标WWW,我们可以这样构造调度问题的实例:创建n个任务的处理时间tj=wjt_j=w_jtj=wj,开始时间rj=0r_j=0rj=0,没有截至时间(dj=1+∑jwj)(d_j=1+\sum_jw_j)(dj=1+∑jwj)。再额外创建一个任务000,这个任务开始时间为t0=1t_0=1t0=1,开始时间为WWW,结束时间为W+1W+1W+1。
- 如果子数组和问题能找到解,即有一个sum(subset)=Wsum(subset)=Wsum(subset)=W,则对应调度问题一定有解,将任务0放在[W,W+1][W,W+1][W,W+1]时间段内即可。
- 如果调度问题有解,那么任务0只能在[W,W+1][W,W+1][W,W+1]时间段内完成,则有若干任务刚好覆盖[0,W][0,W][0,W],即原子数组和问题一定有sum(subset)=Wsum(subset)=Wsum(subset)=W。
算法分析与设计——规约和NPC问题相关推荐
- 程振波 算法设计与分析_算法分析与设计之动态规划
动态规划同样是一种将问题分解为求解子问题的方法,不过与分治不同的是,动态规划算法的子问题不是相互独立的,而是有公共的部分,即有重叠子问题,这个时候使用分治算法,将会重复计算公共的子问题,效率很低!而用 ...
- 一本好的教辅,可以少走很多弯路:算法分析和设计 王晓东
算法分析和设计 王晓东 我觉得第三版JAVA版本最好,第4版是C++版本,删减了几章. 可以配合北大屈婉玲教授的视频课程一起看 自己走了一些弯路,希望后续的可以避免以下 下载地址如下,也可以淘宝买本二 ...
- 非计算机专业教学改革,非计算机专业算法分析与设计教学改革论文
非计算机专业算法分析与设计教学改革论文 [摘要]算法分析与设计不仅是计算机专业的核心课程,同时也是与计算机有关的非计算机专业的专业课.本人针对非计算机专业学生在学习过程中存在的若干问题,就教学内容.教 ...
- 《算法分析与设计》课程任务
<算法分析与设计>课程任务 内容包括以下8个部分,建议将任务按以下方式分解:其中1-6的每个部分的简介.适用条件.基本思想.基本步骤.复杂度分析等由1人讲解,实例分析由1人讲解(注:至少一 ...
- 用c语言验证装载问题 回溯法,《算法分析与设计》期末考试复习题纲(完整版)...
<算法分析与设计>期末复习题 一.选择题 1. 算法必须具备输入.输出和( D )等4个特性. A.可行性和安全 性 B .确定性和易读性 C.有穷性和安全 性 D .有穷性和确定性 2. ...
- 东师19年春计算机在线作业,东师算法分析与设计20春在线作业1【标准答案】
算法分析与设计20春在线作业1题目 试卷总分:100 得分:100 一.单选题 (共 20 道试题,共 40 分) 1.按F5开始调试,程序便会直接运行到断点处.接下来可以逐行来运行程序,查看各个变 ...
- 算法分析与设计实验报告 ——二分搜索程序算法的实现
算法分析与设计实验报告 --二分搜索程序算法的实现 实验目的及要求 1.理解分治算法的概念和基本要素: 2.理解递归的概念: 3.掌握设计有效算法的分治策略: 4.通过二分搜索技术学习分治策略设计技巧 ...
- 算法分析与设计实验报告——实现汽车加油问题
算法分析与设计实验报告--实现汽车加油问题 目录: 算法分析与设计实验报告--实现汽车加油问题 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与讨论 ...
- 算法分析与设计实验报告——二分搜索算法的实现
算法分析与设计实验报告--二分搜索算法的实现 目录: 算法分析与设计实验报告--二分搜索算法的实现 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与 ...
最新文章
- 为什么数据科学不值得?
- python中popen转变时区_python中的subprocess.Popen()使用
- socket只能连接本地mysql_MySQL本地用IP登陆而非socket
- 【网络流】人员雇佣(luogu 1791)
- 论文阅读 - Group Normalization
- Objective-C文件流操作
- 制作自定义工作流(WWF)设计器
- 接口测试工具---apipost控制台使用
- 单身税的时代就要来临,你还没有用Python帮你找一个女朋友吗?
- webmin安装_如何在Ubuntu 18.04上安装Webmin
- LA3485二分+求解积分方程+辛普森算法计算积分
- android之activity跳转
- 数字/模拟信号中带宽的含义
- 诊断2018微商:从乱象到赋能,世界微商大会发明的新玩法为您指路
- 数据化是什么,企业为什么要数据化管理?【Teamface企典】
- 【NOIP普及组】1919:【02NOIP普及组】选数
- 如何在 Python3 中对列表 通过比较排序(不懂就问)?
- Stacked Hourglass Networks for Human Pose Estimation
- Python写入数据到txt文本中
- 计算机修改users用户名,笔记本电脑更改用户名_笔记本电脑更改user