NP完全性

本文探讨了算法的时间复杂性和NP问题的性质,重点介绍了多项式时间算法、判定问题与最优化问题的相互转化。阐述了归约算法的概念,并通过3-CNF-SAT与CLIQUE问题的归约证明了NP完全问题的特性。此外,解释了P与NP类问题的关系,以及NP完全问题在解决NP问题中的核心地位。最后,提出了证明NP完全问题的方法,并以集合覆盖问题为例进行了详细分析。
摘要由CSDN通过智能技术生成

大部分时间内,我们研究的算法都是多项式时间算法:对于规模为n的输入,在最坏情况下的运行时间是 O ( n k ) O(n^k) O(nk),其中k是某一确定常数。那是否所有的问题都可以在多项式时间内解决呢?答案是否定的。本节的主体就是对问题的复杂性的研究。


一 问题

  • 问题:由InputOutput两部分组成
  • 实例:是由一个具体的输入Input

按照问题的类型可以粗略的将问题分为两个类别:

  • 最优化问题:每一个可行解都有一个关联的值,我们希望找出一个具有最佳值的可行解。

  • 判定问题:答案是简单的是和否

    在这里插入图片描述

决策问题与优化问题可以互相转化:

  • 通过对待优化的值强加一个界,可以将最优化问题转换为相关的判定问题。
  • 判定问题可以通过反复利用二分查找询问是否可以优化。

当我们试图证明最优化问题不易处理时,就可以利用该问题相关的判定问题之间的关系,判定问题要更容易一些。如果某个最优化问题比较容易,那么其相关的判定问题也会比较容易,如果我们能提供证据表明某个判定问题是个困难问题,就等于提供 l证据表明相关的最优化问题也是困难问题。NP完全性理论更注重与判定问题。

二 归约算法

假设对于某个判定问题A,我们希望能在多项式时间内解决他。假设有另一个不同的判定问题B,我们知道如何在多项式时间内解决它。最后假设有一个过程,它可以将任意A的实例a转化为B的具有以下特征的某个实例b:

  • 转化操作需要多项式时间
  • 两个实例的解是相同的:a的解是,当且仅当b的解也是

在这里插入图片描述

我们称这一过程为多项式时间归约算法reduction。一般我们用 A ≤ p B A\leq_{p}B ApB表示A可以归约为B下面给出一种在多项式时间内解决A的方法:

  1. 给定问题A的实例a,利用多项式时间归约算法,将它转化为问题B的实例b
  2. 在实例b上,运行B的多项式时间判定算法
  3. 将b的解作为a的解

接下来介绍几个归约的例子

2.1 3-CNF-SAT ≤ p \leq_{p} pCLIQUE

  • 3-CNF-SAT问题

    可满足性(SAT):如果一个布尔公式 ϕ \phi ϕ的具有一个赋值(可满足性赋值)使得公式的值为1,表示该公式是可满足公式。

    可满足性问题:给定一个布尔公式是不是可满足公式。例如一个简单的布尔公式 ϕ = x 1 ∧ x 2 \phi=x_1\wedge x_2 ϕ=x1x2 ( x 1 = 1 , x 2 = 1 ) (x_1=1,x_2=1) (x1=1,x2=1)时值为1,说明该公式具有可满足赋值,是可满足公式。

    我们用以下术语定义3SAT问题:

    • 布尔公式中的文字literal:是指一个变量或变量的非
    • 合取范式CNF(conjunctive normal form):布尔公式可以表示为所有子句的,每个子句都是一个或多个文字的

    如果合取范式中每个子句恰好都有三个不同的文字,则称该布尔公式为3-CNF3-CNF的可满足性问题问题就是3-CNF-SAT问题。下面的布尔公式就是一个典型的3-CNF
    ( x 1 ∨ ¬ x 2 ∨ ¬ x 3 ) ∧ ( ¬ x 1 ∨ x 2 ∨ x 3 ) ∧ ( x 1 ∨ x 2 ∨ x 3 ) (x_1\vee \neg x_2 \vee \neg x_3)\wedge(\neg x_1\vee x_2 \vee x_3)\wedge( x_1\vee x_2 \vee x_3) (x1¬x2¬x3)(¬x1x2x3)(x1x2x3)

  • CLIQUE问题

    无向图G=(V,E)中的团clique是一个顶点子集 V ′ ⊆ V V'\subseteq V VV,其中每对顶点都由一条边来连接,一个团是G的完全子图。

    团问题:是关于寻找图中规模最大的团的最优化问题。作为判定问题形式为:图中是否存在一个给定规模为k的团。

证明3-CNF-SAT ≤ p \leq_{p} pCLIQUE:设 ϕ = C 1 ∧ C 2 ∧ . . . ∧ C k \phi=C_1\wedge C_2\wedge ...\wedge C_k ϕ=C1C2...Ck是一个3—CNF具有k个子句的布尔公式,每个子句 C r C_r Cr恰好有3个不同的文字 l 1 r , l 2 r , l 3 r l_1^r,l_2^r,l_3^r l1r,l2r,l3r我们构造一个图G使得 ϕ \phi ϕ是可满足的,当且仅当G包含一个规模为k的团

构造:对于公式中的每个子句中的每个文字,用一个顶点表示。如果下面两个条件同时满足,就连接这两个顶点:

  • 这两个顶点代表的文字处于不同的子句中。
  • 这两个顶点代表的文字不是对方的

在这里插入图片描述

证明:

  • 公式 ϕ \phi ϕ有一个可满足赋值,那么每个子句 C r C_r Cr中至少有一个文字 l i r l_i^r lir的值为真,从每个子句中挑选出一个这样的文字对应的顶点组成顶点集V',可以断言V'在G中是一个团。因为这两个文字都被映射为1,自然不能互补

  • 反之从图G中选出一个规模为k的团,由于团中顶点不在同一个三元组内(子句),且其赋值为1,公式 ϕ \phi ϕ也是可满足的。

2.2 CLIQUE ≤ p \leq_{p} p VERTEX COVER

无向图的顶点覆盖是一个子集 V ′ ⊆ V V' \subseteq V VV,满足如果有 ( u , v ) ∈ E (u,v)\in E (u,v)E u ∈ V u \in V uV v ∈ V ′ v \in V' vV或两者同时成立。也就是说 V ′ V' V内的顶点相关联的边覆盖G中的边集E。

顶点覆盖问题VERTEX COVER:是指在给定的图中找出最小规模的顶点覆盖,将最优化问题转化为判定问题就是,确定一个图是否具有一个给定规模k的顶点覆盖。

构造:给定一个团的实例 < G = ( V , E ) , k > <G=(V,E),k> <G=(V,E),k>,构造一个顶点覆盖的实例 < G ‾ = ( V , E ‾ ) , k ′ > <\overline{G}=(V,\overline{E}),k^{'}> <G=(V,E),k> G ‾ , E ‾ \overline{G},\overline{E} G,E代表G的补图与G的补图的边集。图G有k规模的团当且仅当G的补图 G ‾ \overline{G} G ∣ V ∣ − k ′ |V|-k' Vk规模的顶点覆盖。

证明:

  • 假设有一个规模为k的团 < G = ( V , E ) , k > 其 中 V ′ ⊆ V <G=(V,E),k> 其中V'\subseteq V <G=(V,E),k>VV,任意 ( u , v ) ∈ E ‾ (u,v)\in \overline{E} (u,v)E,u与v至少有一个属于 V − V ′ V-V' VV的集合中,这就意味着任意 ( u , v ) ∈ E ‾ (u,v)\in \overline{E} (u,v)E是被 V − V ′ V-V' VV所覆盖。这样就形成了一个顶点覆盖的实例 < G ‾ = ( V , E ‾ ) , k ′ > <\overline{G}=(V,\overline{E}),k^{'}> <G=(V,E),k>
  • 反之,假设 G ‾ \overline{G} G具有一个顶点覆盖 V ′ ⊆ V V'\subseteq V VV其中 ∣ V ′ ∣ = ∣ V ∣ − k |V'|=|V|-k V=Vk,那么对于任意 ( u , v ) ∈ E ‾ (u,v)\in \overline{E} (u,v)E,至少有一个顶点属于V’,因此 V − V ′ V-V' VV是一个规模为k的团

三 问题复杂类:P与NP

问题复杂类关注的是当问题的输入规模n增加时资源需求的增长率。所讨论的资源可以是时间(本质上是一个抽象机器上的基本操作的数量),也可以是(存储)空间。它是一种抽象的度量,不以秒或字节为单位给出所需的时间或空间

  • P类问题:可以在多项式时间内解决的决策问题
  • NP类问题:一组决策问题的实例,其答案是Yes,其解可在多项式时间内被验证。

例如哈密顿回路问题:无向图G=(V,E)中的一条哈密顿回路是通过V的每一个顶点的简单回路,具有这种回路的图被称为哈密顿图。给定一个图,是否存在哈密顿回路。

要验证这个问题是否是一个NP问题,提供一个答案为Yes的实例,我们要在多项式时间内验证这个实例是否是一个回路,只需要遍历这个实例看是否经过所有的顶点即可。

在这里插入图片描述

对于P与NP,存在以下关系: P ⊆ N P P \subseteq NP PNP,证明过程很简单:对于任何P类问题存在多项式时间内的算法解决它,那么对于任意一个P类问题的解,只需要用这个解解决问题,就可以在多项式时间内验证它。

P=NP?

在这里插入图片描述

四 问题复杂类:NPC与NP-hard

因为对于P=NP?研究进展的缺乏,另一个新的问题被提出:NP类问题中最难的问题是什么?对于这一类问题被称为NP完全问题(NPC)。这类问题有着惊人的特质:任意一个NP完全问题能在多项式时间内被解决的话,那么NP类问题中的每一个问题都存在一个多项式的解,这样就能证明P=NP

对于NP-Complete的定义:Y是一个NP完全类,当且仅当Y是一个NP类问题且对于任意NP问题X,X都可以归约为Y。前面的团问题、顶点覆盖、哈密顿回路、旅行商问题,集合覆盖问题就是典型的NP完全类问题。

若Y不满足是一个NP类问题的条件,则称Y是一个NP难问题(NP-hard)

计算机科学家眼中的问题复杂类的关系:

在这里插入图片描述

给出一个思考题:答案为D

在这里插入图片描述

五 证明NP-Complate

证明一个问题是NPC类问题的主要依据是以下定理:

如果X是一个NPC类问题,Y是一个NP类问题且X可以归约为Y,那么Y就是一个NPC类问题

因此证明Y是一个NPC类问题主要有三个步骤:

  1. 证明Y是一个NP类问题。
  2. 选择一个合适的NPC类问题X。
  3. 证明X ≤ p \leq_{p} pY。

以集合覆盖问题为例:

  • 输入:一个大小为n的全集U,一系列集合 S = { S 1 , S 2 , . . . , S m } S=\{S_1,S_2,...,S_m\} S={S1,S2,...,Sm},每个集合都是U的子集,以及一个整数k
  • 输出:是否存在 ∣ C ∣ < k |C|<k C<k的子集合 C ⊆ S C\subseteq S CS,使得 ∪ S i ∈ C = U \cup_{S_i\in C}=U SiC=U

在这里插入图片描述

  1. 证明集合覆盖问题是NP问题

    初始化一个数组用于标记全集U中的元素是否出现,遍历一个可行解S’,标记S’中出现过的元素,最后检查数组即可,在多项式时间内即可验证

  2. 选择一个NPC类问题:顶点覆盖问题:

    在这里插入图片描述

  3. 证明顶点覆盖问题可以归约到集合覆盖问题。

    构造:给定一个顶点覆盖的实例: < G = ( V , E ) , k > <G=(V,E),k> <G=(V,E),k>,构造一个集合覆盖的实例 < U , S , k > <U,S,k> <U,S,k>,其中 U = E U=E U=E,对于任意 v ∈ V v\in V vV,构造集合 S v = { e ∈ E    a n d    e = ( u , v ) } S_v=\{e\in E\;and\;e=(u,v)\} Sv={eEande=(u,v)}(对于每个顶点构造一个与该顶点相连的边集作为一个子集)

    证明:对于任意一个大小为k的顶点覆盖集合,与其相连的边的并集为全体边集,因此这些顶点对应的 S v S_v Sv的并集也等于全集U(全体边集),反之亦然。

因此集合覆盖问题就是NP-Complete类问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunburst7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值