NPC问题的证明(可满足性问题、3-CNF可满足性问题、团问题、顶点覆盖问题)

NPC问题的证明

一、基础概念

  • P问题:如果一个判定问题能在多项式的时间内解决,那么这个判定问题就属于P问题
  • NP问题:对于一个判定问题,如果给定一个可能的解实例(称为“证书”),可以在多项式时间内验证这个解实例,即判定为真还是为假,那么它是 NP问题。
  • NPC问题:如果任何一个NP问题都能通过一个多项式时间算法,转换某个NP问题,那么这个NP问题就称为NPC问题。
  • NP-Hard问题: 如果任何一个NP问题都能通过一个多项式时间算法,转换某个问题,但这个问题不一定是NP问题,那么它是 NP-Hard问题
    由于

二、NPC问题的证明:

证明方法:

  • 首先证明问题L属于NP问题;
  • 其次,找出一个NPC问题L’,如果L’能在多项式时间内约简到L,即证明L属于NP-Hard问题;(证明原理:因为对于任意一个NP问题L’’,都能在多项式时间约简到L’,而L’又能在多项式时间内约简到L,所以任意的一个NP问题L’’,都能约简到问题L,即L是NP-Hard问题)
  • 于是就证明了L属于NPC问题。

三、NPC问题证明举例:

电路可满足性问题(CirsuitSAT)

问题描述:
给定一个电路图,如果存在一组输入信号,使输出为"1",那么此电路使可满足的。

证明过程暂略。


可满足性问题(SAT)

问题描述:
由 N个布尔变元X1,X2,X3…Xn,和M个布尔连接符(如:与、或、非、蕴含、等价…)构成的布尔表达式F,如果存在一组布尔变元和布尔连接符实例,判别F输出为1,则为可满足。

证明过程:
1. 证明SAT属于NP问题:
给定一组布尔变元和布尔连接符的实例,即一个证书y,显然可以在多项式时间类判定是否F的输出为1 。即证SAT属于NP问题。

2. 证明CirsuitSAT问题可以在多项式时间内约简到SAT问题:

  • 任意一个电路图都可以在多项式时间内转化一个布尔表达式F, 即对于CirsuitSAT问题的任何一个实例,都可以在多项式时间内转化成一个SAT问题的实例。
  • SAT问题可满足当且仅当CirsuitSAT问题可满足:
    易知,SAT问题可满足 —> CirsuitSAT问题可满足,
    且CirsuitSAT问题可满足—>SAT问题可满足。

3-CNF可满足性问题(3-CNF-SAT)

问题描述:由 3n个布尔变元X1(1)…Xn(1)…X1(2)…Xn(2)…X1(3)…Xn(3),构成的n个子句C1C2C3…Cn-1Cn,每个子句为Ci = (X1(i)或X2(i)或X3(i)),布尔表达式F=C1且C2且C3…且Cn-1且Cn,如果存在一组布尔变元赋值,可以判别F输出为1,则为3-CNF-SAT是可满足的。

证明过程暂略。
提示:SAT是可以通过公式构造,转化成3-CNF-SAT的。
如a+c*b 等价于(y2且 y2等价于c且b) 且 (y1且 y1等价于a且y2)


团问题(Clique)

问题描述:
给定义一个无向图G = 和一个正整数k,是否可以在图G中找出一个大小为k的完全子图(一个团)。

证明过程:
1. 团问题是NP问题。
对于一个给定的无向图G和整数k,以顶点集V的一个子集V’做证书,只需要验证V’是否是G中的一个大小为k的团。显然,只需要检查V’中的任意两个点u,v,是否有(u,v)属于G,可以知道这能在多项式时间内完成。所以团问题是NP问题。

2. 一个3-CNF可满足性问题可以在多项式时间内约简成一个团问题。

  • 约简算法构造:对于3-CNF-SAT的一个实例 F = C1 C2…C3…Cn-1Cn ,子句 Ci有三个不同的文字l1(i),l2(i),l3(i),对于两个子句中的两个文字 la(i)和 lb(j),如果满足
    (1)i != j
    (2)la(i)不是 lb(j)的非
    那么在图G中可以用一条边连接 la(i)和 lb(j)

  • 证明F是可满足的当且仅当G有一个大小为k的团。
    a. 假定F是可满足的,那么每个子句中都可以给一个文字赋值为1,那么根据约简算法的构造,图G中一定有一个大小为k的团
    b. 假定图G有一个大小为k的团,那么依据对应关系,团中的 k个点对应的 k个文字可以赋值为1,而这 k个文字属于 F中不同的子句,可以知道 F必然是可满足的。


顶点覆盖问题(VertexCover)

问题描述:
给定一个无向图G,和一个整数k,求是否存在一个点集V’,使得所有的(u,v)属于E,都有u属于V’或者v属于V’(或者u和v都属于V’),且V’的大小为k。

证明过程:
1. 证明VertexCover属于NP问题:
给定一个点集V’(即一个证书y),只需要遍历G中所有的边,判断其是否在点集V’上满足“顶点覆盖”的条件,易知这可以在多项式时间内判断,即VertexCover问题,可以在多项式时间内验证。所以VertexCover属于NP问题。

2. 证明一个Clique问题可以在多项式时间内约简到一个VertexCover问题:
只需要证明,团问题图G有一个大小为k的团当且仅当顶点覆盖问题图!G有一个大小为|V| - k的顶点覆盖。(其中!G是G的补图

  • 团问题可以推导顶点覆盖问题
    设G有一个团V’且其大小为k,只需要证明V-V’是!G的顶点覆盖。
    因为对于任意的(u,v)属于!E,有(u,v)不属于E,而团V’中的点任意两点都构成G中的边,所以u或者v至少一个属于V-V’。即任意的(u,v)属于!E,有u或者v属于V-V’。

  • 顶点覆盖问题可以推导团问题
    设!G有一个顶点覆盖V’且其大小为k,只需要证明V-V’是G的团。 如果(u,v)属于!E,u或者v至少一个属于V’,反过来,u且v都不属于V’,那么(u,v)不属于!E,即(u,v)属于E,即V-V’构成G的一个完全子图。

你可能感兴趣的:(算法设计与分析)