Field note
np_complete
NP-complete
三个经典的存在多项式时间算法的问题:
- 最短路径问题:给定一个有向图,即使是带负权的,我们可以在的时间内找到从单一源点开始的最短路径;
- 欧拉回路问题:是否存在一个回路(即起点终点是同一个顶点)使得它恰好经过图中每条边一次?这个问题可以在的时间内用深度优先搜索解决;
- 2-CNF的可满足性问题(简称2-SAT问题):我们称一个逻辑表达式是即(k-合取范式)的,如果它是由个子句的合取()构成的,每个子句是由个变量或者它们的否定构成的析取().2-SAT问题就是判断一个2-CNF逻辑表达式是否存在对其变量的某种0和1的赋值,使得它的值为1,这个问题可以在多项式时间内解决.例如
满足赋值条件.这一问题与图论中的强连通分量有关.
??? warning “0-1背包问题” 有一个容易出现混淆的背包问题,我们最终的时间复杂度为,是输入的物品个数,是背包最大容量.注意我们的在输入时,是以二进制的方式表达的,它二进制表示的长度是,而是的指数,因此它的时间复杂度实际上是指数级别的.
对上面问题进行变体:
- 最短路问题变体:如果带负圈的最短路问题中我们的要求不是找到负圈就结束,而是给出具有最短路的无环路径,那我们就无法在多项式时间内解决这个问题;
- 哈密顿回路:是否存在一个回路,经过图中其他节点刚好一次,这个问题也不存在多项式时间算法;
- 3-SAT问题:没有多项式时间算法.
复杂类
DTIME和NTIME
我们考虑一族函数.称一个问题是:
- 的,如果求解规模为的问题的确定性图灵机能在步之内停机;
- 的,如果求解规模为的问题的非确定性图灵机能在步之内停机;
一个形式语言的判定问题的规模指的是输入的长度.
-
P问题:可以在多项式时间内解决(确定性图灵机能在多项式时间内停机解决).
-
NP:可以在多项式时间内验证(给一个解,我能验证它是对的还是错的)
-
NP-complete:
- 既是,又是,如果我们能在多项式时间内解决一个问题,那么所有的问题都能在多项式时间内解决.
- 它本身在NP中,并且所有问题都可以在多项式时间内归约到它
-
NP-hard:
- 它不一定在NP中,但所有的问题都可以在多项式时间内归约到它
!!! note 它们之间的关系:
- $P$问题可以在多项式时间内解决,自然也能在多项式时间内验证,所以$P$问题也是$NP$问题;
- $NPC$问题是$NP$问题的子集,$NPC \subseteq NP$;
- $NPC$是$NP-hard$的子集,$NPC \subseteq NP-hard,NPC = NP \cap NP-hard$;
- $NP-hard$问题不一定是$NP$问题,$NP-hard \nsubseteq NP$;
- 如果$NPC$问题能在多项式时间内解决,那么所有的$NP$问题就能在多项式时间内解决,$P=NP \Rightarrow P=NP=NPC$.
如果我们不能在多项式时间内解决一个问题,那么因为问题是问题的子集,所以.
- 问题是的,并且.
- 是的.
- 是多项式时间可解的.
- 0-1背包问题是NP困难的
- 哈密尔顿回路是
- 停机问题是困难
- Post Correspondence Problem是不确定的,不在NP内
- (0,1,2)- championship是P问题,(0,1,3)是NP完全问题
- 顶点覆盖是问题并且顶点覆盖与独立集问题等价(一个顶点覆盖的补就是独立集).
- 在同一个图中,顶点覆盖与独立集是互补的
- 一个图中大小为的团,对应补图中大小为的顶点覆盖
Karp归约
称一个语言A可以被多项式地归约(或Krap归约)到B,如果存在一个可以在多项式时间内计算的函数使得
记作.那么一定不会比难