本周的内容是NP问题,NP的全称是Non-deterministic Polynomial,即多项式复杂程度的非确定性问题。百度上对NP的解释是,P/NP问题是在理论信息学中计算复杂度理论里至今没有解决的问题。通俗的说,是将不可知的问题转化为已知的问题,进而计算器复杂度。
首先介绍多项式时间的规约,即Polynomial-Time Reductions,通过解决另一个不同问题的假设的子程序,使用不包含子程序在内的多项式时间来解决一个问题的方法。主观上,一个多项式时间规约证明了第一个问题不比第二个问题难,因为只要对于第二个问题有有效的解决办法,那么对于第一个问题就一定也存在解决方法。
根据计算的复杂度,我们可以将问题分为两类,一种是可以在多项式时间内解决的,另一种是不能在多项式时间内被解决的。下面的表格给出了一些算法。
一些问题被证明需要指数时间:
1.给定一台图灵机,它能否在最多k步的时候停止?
2.给定一个nxn的棋盘,黑棋能够保证赢吗?
一个不乐观的消息是几十年来大量的基础问题都忽略了分类。这一节的内容是表明这些基本问题是计算等价的,似乎是一个非常难问题的不同表现。
假设我们可以在多项式时间内解决X问题,那么我们在多项式时间内能解决其他什么问题吗?这里引入Reduction的定义。
Reduction:问题X可以多项式规约为问题Y,如果问题X的任意实例可以使用下面的条件被解决:
A) 多项式数量的标准计算步骤加上,
B) 可以解决问题Y的oracle多项式数目次的调用,这里,oracle是特殊硬件提供的可以在单步中解决Y的实例的计算模型。
表示为
这里,X是已知的可以在多项式时间内解决的问题,Y是不可知复杂度的问题。中间的符号表示,有方法将X转换为Y,有点类似于小于等于符号的含义是表明X的复杂度小于等于Y的复杂度,一般情况下,符号中p的上面会有一个m,表示可以是many to one reduction,也就是可以是多对一的映射。如果X有polynomial-time解,那么该解是下界;如果Y有polynomial-time解,那么该解是上界。
因此多项式时间的规约的目的是根据问题的相对困难度来对问题分类的。如果有,y可以在多项式时间内被解决,那么X一定也能在多项式时间内被解决;如果
,X不能够在多项式时间内被解决,那么y也不能在多项式时间内被解决。
我们也可以建立等价性,这里的等价是指的reduction的成本。如果和
,那么我们可以表示为
。
下面有三个基本的规约策略,通过简单等价规约、从特殊案例到一般案例的规约和通过子程序的编码来规约。
一、简单等价规约
首先定义独立集(IndependentSet, 我们在Matroid中已经学习过),给定一个图G=(V, E)和一个整数k,存在一个顶点的子集,
,对于每一条边至多其中一个端点在S中。
如下图:
对于上图,存在一个大小大于等于6的独立集,但是不存在大小大于等于7的独立集。
下面定义一个顶点覆盖集,给定一个图G=(V, E)和一个整数k,存在一个顶点的子集,
,对于每一条边至少其中一个端点在S中。
例如:
对于上图,存在一个大小小于等于4的顶点覆盖集,但是不存在一个大小小于等于3的顶点覆盖集。
对于顶点覆盖集合和独立集,有
其实从上面两个图,我们就可以看出,两个集合互补。S是一个独立集当且仅当V-S是一个顶点覆盖集。