如何证明一个问题是NP-Hard或NP-Complete?

article/2025/9/18 8:50:19

文章目录

  • NP-hard vs NP-Complete
    • Reduction
  • SAT Problem
    • Reducing SAT to Shortest Clique Problem
    • Reducing SAT to Shortest Tour Problem
  • A List of NP-Complete
    • Set Vertex Cover Problem & Independent Set
    • K-coloring and Clique
    • Packing
    • Longest Common Subsequence
  • 参考资料
  • 附录
    • Big O Notation

NP-hard vs NP-Complete

判断一个问题是不是NP-Complete有两个步骤:

  1. 判断是否NP,就是算法结果的正确性能不能在多项式时间内验证
  2. 判断是否NP-hard,要判断NP-hard,我们可以使用一个叫Reduction的技巧。直观来说,如果你能用你的问题的求解器来求解另一个已知是NP-hard问题,那么你的问题也是NP-Hard的。

Reduction

Reduction是将两个算法建立联系的一个过程。我们说X reduce 到Y,意味着,假设现在有一个Y的黑盒求解器,于是我们设计一个多项式算法来用Y的求解器来求解问题X。
也就是说,当这个求解器是多项式时间的时候,意味着X也可以多项式求解。那如果我们已经知道X是很难求解,如果X可以reduce到Y,那么意味着Y跟X一样难解,因为只有困难的求解器才能解决困难的问题。
而这正是证明问题Y是NP-hard或NP-complete的思路,只要找到一个Np-hard或者NP-complete的问题X可以reduce到Y就可以了。

在这里插入图片描述

那么NP-hard是什么?

如上图,在所有NP(non-deterministic polynomial-time)问题中(结果正确性可以在多项式时间验证),有些问题是特别难的,如NP-complete问题,有些问题很简单,如P问题,可以在多项式时间解决。

那如果我们找到一个特别的问题H,使得所有NP问题都可以reduce到问题H上,那这个问题H肯定特别难,因为我们能用这个问题H解决所有的NP问题,因此我们称这个问题H为NP-Hard问题。

这个经过reduce的问题H不一定是NP问题,于是才有上述示意图的上部分,即有一部分NP hard问题是落在圈外的。如果问题H是属于NP的话,那么问题H就是NP-complete问题,NP完全是NP和NP-hard的交集。

NP定义: 可以在多项式时间验证结果正确性的问题。
NP-hard定义: 对于问题H,所有NP问题都可以reduce到H。

这意味着,如果NP-hard可以用多项式解决,那么所有NP问题都可以用多项式解决。不过目前还没人找到多项式算法。

SAT Problem

在实际中,我们判断一个问题是不是NP-hard,通常不会去根据这个定义来判断,而是使用Reduction来判断,就是找到一个已经被证明是NP-complete的问题,然后尝试reduce。

总的来说,判断一个NP问题是不是NP-Complete的两个方法

  1. 找到一个NP-Complete问题,经过证明可以reduce to 你的问题,这意味着你的方法可以解决这个NP-Complete问题,那很显然,这个解决方法也是NP-Complete的。
  2. 所有的NP问题都可以reduced到你的问题

很显然,方法1简单多的,我们只要找到一个现成的 NP-Complete问题就可以了,然而,这个世界上,总得有第一个NP-Complete问题才能够用这个方法,这第一个NP-Complete问题的证明,注定了只能用方法2,那就是要证明所有NP问题都可以reduced到这个问题上,而万幸的是这第一个NP-Complete问题在40年前被找到了,它就是著名的SAT问题。

SAT实际上并没有真的遍历所有的算法一个个去reduce,相反,他证明了所有的算法都是可以编码为boolean formula问题,这意味着所有算法都可以使用SAT的求解器去求解,因为他们本质上就是boolean formula问题。至于怎么证的,太难了这里就不讲了。

现在我们介绍一下SAT问题。对于任意的boolearn foumula我们总能写成以下标准式:
( . . ∨ . . . ∨ . . ) ∧ ( . . ∨ . . . ∨ . . ) ∧ . . . ( ..\lor ...\lor ..) \land ( ..\lor ...\lor ..) \land ... (.......)(.......)...
其中 ∨ \displaystyle \lor 表示或, ∧ \displaystyle \land 表示与。上述表达式是很多个 ∧ \displaystyle \land 并在一起的,所以我们称每一个 ( . . ∨ . . . ∨ . . ) \displaystyle ( ..\lor ...\lor ..) (.......)都是一个Clause. 接下来举个例子:
( x 1 ∨ x 2 ‾ ∨ x 3 ) ∧ ( x 1 ‾ ∨ x 2 ) ∧ ( x 2 ‾ ∨ x 3 ) \left( x_{1} \lor \overline{x_{2}} \lor x_{3}\right) \land \left(\overline{x_{1}} \lor x_{2}\right) \land \left(\overline{x_{2}} \lor x_{3}\right) (x1x2x3)(x1x2)(x2x3)

上面的每个 x 1 , x 2 , x 3 \displaystyle x_{1} ,\ x_{2} ,\ x_{3} x1, x2, x3只能取0,1两个值,加上一个横线表示取非,那么当 x 1 , x 2 , x 3 \displaystyle x_{1} ,\ x_{2} ,\ x_{3} x1, x2, x3取什么值的时候,这个公式为真?或者根本不存在一个取值使公式为真?这就是SAT问题。最后这道题答案是x1=0,x2=0,x3=任意。一个更简单的问题是3-SAT问题,每个clause恰好都有3个元素,可以证明这个3-SAT也是NP Complete的。

Reducing SAT to Shortest Clique Problem

接下来介绍Reduction到底是怎么使用。首先Clique问题就是找到一个图大小为k的团,其中团是一个完全图(每个结点相互联结)。
考虑以下 bool formular,在什么情况下才是真?

( x 1 ∨ x 2 ‾ ∨ x 3 ) ∧ ( x 1 ‾ ∨ x 2 ) ∧ ( x 2 ‾ ∨ x 3 ) \left( x_{1} \lor \overline{x_{2}} \lor x_{3}\right) \land \left(\overline{x_{1}} \lor x_{2}\right) \land \left(\overline{x_{2}} \lor x_{3}\right) (x1x2x3)(x1x2)(x2x3)
这个公式只有在3组clause中,每组取1个变量,这3个变量同时为真的时候才成立。那么找到“三个变量同时为真”,不相当于一个大小为3的团吗?

在这里插入图片描述

为了体现这点我们构造一个图,每个clause作为一组结点,分别有3组,并与其他组之间的结点连线,注意,因为我们需要3个变量同时为真,所以,不可以同时为真的结点不可以连线,比如 x 2 ‾ , x 2 \displaystyle \overline{x_{2}} ,x_{2} x2,x2是没有连线的,那么只要我们在三组变量之间找到一个团,就可以同时设这3个变量为1,也就找到了这个bool formula的解了。

Reducing SAT to Shortest Tour Problem

在这里插入图片描述

Shortest Tour 问题就是如何找到一条最短路径,访问所有的结点并回到原点。

现在构造一个特殊的结构:

A-B

从A到B的最短路径有多少条?答案是只有两条,不管我们怎么加长这个结构,也是只有两条。为了将SAT跟 Shortest Tour 联系起来,直觉来看,我们似乎可以利用选择选择哪条路径来表达 真还是假。

如果我们将这些结构复制n份然后连起来
在这里插入图片描述
那么一共就有 2 n 2^n 2n条可能的路径。那么每一份路径就表示一个true或false。现在x1,x2,…,xn有了,那么怎么将他们组合起来形成clause呢?

假设有一个clause就是 . . . ∧ x 2 ∧ . . . ...\land x_2 \land ... ...x2...,很显然这个clause意味着x2一定要等于true,那么就相当于下图,额外加了一个结点,强制让x2只走那条等于true的路。
在这里插入图片描述

同理对于一个更复杂的clause,就是连接多条边。只要x1 x2 x3其中有一个经过下面clause的结点,那么这个clause就为真,如果一共有m个clause,我们就可以构造出m个这样类似的结点,如果能找到一条最短路径,使得他经过所有的clause结点,那么这个bool formula就一定为true.
在这里插入图片描述

A List of NP-Complete

为了证明一个问题是NP complete我们有必要去了解更多的NP complete问题以方便证明,不然每次都只用SAT去证也是挺困难的事情。wiki上有一个列表,基本上很全了:List_of_NP-complete_problems

这里拿一些经典问题来介绍一下。

Set Vertex Cover Problem & Independent Set

在这里插入图片描述

最大独立集和最小结点覆盖其实是两个互补的问题。
所谓independent set就是在集合中,每个结点都不会相互连接。上图结点 {3, 4, 5} 是一个大小为3的 independent set 而 {1, 4, 5, 6} 则是最大的 independent set。

而Vertex Cover就是找到一个结点集合使得图上的每一条边的至少一端是在集合中。在上图结点{2, 3, 7} 就是最小的覆盖结点,大小为3。

显然{2, 3, 7}恰好跟最大独立集 {1, 4, 5, 6}互补。这是因为在independent set中,任意2个结点<u,v>都不会有一条边相连,所以与u,v相连的结点一定在集合外面,所以independent set的补集一定是vertex cover的。

K-coloring and Clique

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0oVTu20-1576142062972)(https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Petersen_graph_3-coloring.svg/330px-Petersen_graph_3-coloring.svg.png)]
染色问题就是找到一种染色方式,使得邻居的颜色都不一样。
染色问题跟找团问题是很相近的,考虑一下两个问题:

  1. 如果一个图包含一个大小为k的clique,那么需要多少种颜色?
  2. 如果一个图最多需要k种颜色,那么最大团的大小是多少?
    他们的答案都是k。因为jk-color问题要求所有邻居的颜色不同,而团正是这种相互邻居的数量。

Packing

这个问题就是给你一定容量和形状的容器,怎么装上价值最高的东西,又或者是装尽可能多的东西,这问题有很多变种。

Longest Common Subsequence

有两个字符串:

  1. lemonade
  2. blendev
    他们最大的公共的序列是什么?注意,这个序列是不需要连续的(连续的叫substring,它不是np hard问题),可以中间跳过一些元素,而且序列的个数是任意的,如果是确定的话,比如已知只有两个,那不是np-hard,而可以用动态规划求解。
    显然这个字符串最大公共部分是: lende

参考资料

https://classroom.udacity.com/courses/cs313/
wiki: NP-hardness
Algorithm design - Jon Kleinberg, Éva Tardos

附录

Big O Notation

影响一个算法的速度的因素有非常多,输入的大小,电脑的速度,内存大小,算法使用什么语言来实现等等,因此想要分析算法,我们要做几个简化的假设来忽略掉不必要的细节。

假设有两个算法,他们的最坏运行时间分别为,A: 3 n 2 − n + 10 \displaystyle 3n^{2} -n+10 3n2n+10,B: 2 n − 50 n + 256 \displaystyle 2^{n} -50n+256 2n50n+256,其实我们并不关心里面常数项的大小,很显然当n足够大的时候,算法A要比算法B块。基于此我们可以定义一个大O符号来表达这种关系。
大O的定义:我们称 f ( x ) = O ( g ( x ) ) as  x → ∞ \displaystyle {\displaystyle f(x)=O(g(x))\text{ as } x\rightarrow \infty } f(x)=O(g(x)) as x,当且仅当,存在一个实数M,使得
∣ f ( x ) ∣ ≤ M g ( x ) for all  x ≥ x 0 . {\displaystyle |f(x)|\leq \ Mg(x)\text{ for all } x\geq x_{0} .} f(x) Mg(x) for all xx0.
话句话说,大O表示了一种上界,举几个例子。 n + 1 = O ( n 2 ) \displaystyle n+1=O\left( n^{2}\right) n+1=O(n2), n 2 + n + 1 = O ( n 2 ) \displaystyle n^{2} +n+1=O\left( n^{2}\right) n2+n+1=O(n2)。对于算法而言,我们一般使用算法的最坏时间复杂度作为f(x),然后再求出其g(x),在算法中,一般假设内存读取时不需要运算时间的,只有运算的时候(加减乘除判断大小)才会算次数。举个例子,

result=0
for i in range (0,n):for j in range(i,n):result=result+1

该算法的运行时间为 3 ∗ ( n + n − 1 + . . . + 2 + 1 ) = 3 ∗ n 2 + n 2 = O ( n 2 ) \displaystyle 3*( n+n-1+...+2+1) =3*\frac{n^{2} +n}{2} =O\left( n^{2}\right) 3(n+n1+...+2+1)=32n2+n=O(n2),每次for循环以及最后的加法都是需要消耗计算资源的,所以3是这么来的。


http://chatgpt.dhexx.cn/article/mjuc9WMJ.shtml

相关文章

【机器学习】P问题、NP问题、NP-hard、NP-C问题解析与举例理解

目录 1 基本概念1.1 多项式和时间复杂度1.2 P和NP1.3 NP-hard和NP-C1.4 总结 2 举例理解NP问题3 其他NP问题 1 基本概念 1.1 多项式和时间复杂度 &#xff08;1&#xff09;多项式 a x n b x n − 1 c ax^nbx^{n-1}c axnbxn−1c&#xff0c;形如这种形式的就被称为x的最高…

P问题、NP问题、NPC问题、NP-hard问题详解

要理解P问题、NP问题、NPC问题、NP-hard问题&#xff0c;需要先弄懂几个概念&#xff1a; 什么是多项式时间&#xff1f;什么是确定性算法&#xff1f;什么是非确定性算法&#xff1f;什么是规约/约化&#xff1f; 文章目录 多项式时间&#xff08;Polynomial time&#xff09…

什么是P=NP问题?

来自&#xff1a;后端技术指南针 1 前言 今天和大家一起了解个高能知识点&#xff1a;PNP问题。 看到这里我们可能是一头雾水&#xff0c;不由得发问&#xff1a; P问题是什么&#xff1f;NP问题又是什么&#xff1f;PNP又是什么意思&#xff1f;研究并解决PNP问题的意义是什么…

NP问题总结(概念+例子+证明)

目录 基本概念 证明思路 常见例子 21个常见NPC问题 原理论证 基本概念 P类问题:(polynominal) 存在多项式时间算法的问题&#xff0c;即在多项式时间内可解的问题&#xff1b; 例如&#xff1a;冒泡排序、快速排序等问题&#xff1b; NP类问题:(Nondeterministic pol…

[知识归纳]关于NP问题的概念与解释 | NP-complete NP-hard

NP问题 P问题是一类可以通过确定性图灵机在多项式时间(Polynomial time)内解决的问题集合。NP问题是一类可以通过非确定性图灵机( Non-deterministic Turing Machine)在多项式时间(Polynomial time)内解决的决策问题集合。 多项式时间&#xff08;Polynomial time&#xff09…

P问题、NP问题、NP完全问题和NP-hard问题

在讲P类问题之前先介绍两个个概念&#xff1a;多项式&#xff0c;时间复杂度。(知道这两概念的可以自动跳过这部分) 1、多项式&#xff1a; 恩....就是长这个样子的&#xff0c;叫x最高次为n的多项式.... 2、时间复杂度 在计算机算法求解问题当中&#xff0c;经常用时间复…

P问题、NP问题、NPC问题、NPH问题详解

P&#xff1a; Polynomial&#xff0c;是指能在多项式时间内解决的问题&#xff1b;&#xff08;如果一个问题可以找到一个能在多项式的时间里解决它的算法&#xff0c;那么这个问题就属于P问题。P是英文单词多项式的第一个字母。&#xff09;NP&#xff1a;Non-deterministic …

判断凸多边形(向量叉积运用)

469. 凸多边形 - 力扣&#xff08;LeetCode&#xff09; 给定 X-Y 平面上的一组点 points &#xff0c;其中 points[i] [xi, yi] 。这些点按顺序连成一个多边形。 如果该多边形为 凸 多边形&#xff08;凸多边形的定义&#xff09;则返回 true &#xff0c;否则返回 false 。…

【编程题】判断一个多边形是否为凸多边形

题目&#xff1a; 顺序输入点的坐标&#xff0c;判断按这些点顺序连接起来的多边形是否为凸多边形还是凹多边形 输入描述&#xff1a; 输入包括两行&#xff1b; 第一行是一个整数n&#xff0c;n>3&#xff0c;作为提示输入的顶点数量 第二行为2*n个整数&#xff0c;为各点…

10343 划分凸多边形(优先做)

题目描述 10343 划分凸多边形&#xff08;优先做&#xff09; 时间限制:800MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 问题描述&#xff1a;一个正凸N边形&#xff0c;可以用N-3条互不相交的对角线将正N边形分成N-2个三角形…

N顶点凸多边形中对角线交点的个数

题目描述 对于一个N个定点的凸多边形&#xff0c;他的任何三条对角线都不会交于一点。请求楚图形中对角线交点的个数。 例如&#xff0c;6边形&#xff1a; 我们可以发现&#xff0c;两条不平行对角线才会有一个交点&#xff0c;同时&#xff0c;两条对角线又确定了一个四边形…

凸多边形的划分

题目&#xff1a; 给定一个具有 NN 个顶点的凸多边形&#xff0c;将顶点从 11 至 NN 标号&#xff0c;每个顶点的权值都是一个正整数。 将这个凸多边形划分成 N−2N−2 个互不相交的三角形&#xff0c;对于每个三角形&#xff0c;其三个顶点的权值相乘都可得到一个权值乘积&a…

`算法知识` 多边形, 凸多边形, 外接矩形

catalog 图片引用图二 多边形分类周长多边形的外接矩形 凸多边形去除若干点, 仍为凸多边形 ID_COUNT: 3 图片引用 图二 多边形 以下讨论, 均在(笛卡尔坐标系)中, 即两点间的距离为 (欧几里得距离) 由N条边和N个点组成, N > 3, 面积一定> 0 每条边, 都是(线段) 线段: 必…

判断多边形的凹凸性和计算多边形面积:利用向量叉乘

根据百度百科的讲解&#xff1a; 凸多边形 现在重点讲解顶点凹凸性法&#xff08;最常用也是较为简单的方法&#xff09;&#xff1a;计算总结在最后。 利用向量叉乘的相关知识进行计算&#xff1a;假设当前连续的三个顶点分别是P1&#xff0c;P2&#xff0c;P3。计算向量P1P3…

判断点在凸多边形內

判断点在凸多边形內 判断点在凸多边形内的算法有很多&#xff0c;可以参考链接3&#xff0c;个人尝试使用了同侧法&#xff0c;此处也只解析这个方法 算法原理&#xff1a; 同侧法是判断点在向量哪一侧的一个方法&#xff0c;这个算法的概念是来自于参考文献一&#xff0c;参…

—【动态规划】凸多边形最优三角剖分

0014算法笔记——【动态规划】凸多边形最优三角剖分 分类&#xff1a; 算法 2013-03-05 20:10 612人阅读 评论(0) 收藏 举报 三角剖分 凸多边形最优解 动态规划 算法笔记 1、问题相关定义&#xff1a; (1)凸多边形的三角剖分&#xff1a;将凸多边形分割成互不相交的三角形的…

0014算法笔记——【动态规划】凸多边形最优三角剖分

1、问题相关定义&#xff1a; (1)凸多边形的三角剖分&#xff1a;将凸多边形分割成互不相交的三角形的弦的集合T。 (2)最优剖分&#xff1a;给定凸多边形P&#xff0c;以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分&#xff0c;使得该三角…

判断平面多边形的凹凸性

对于平面多边形的三角化处理也是计算机图形学里面的一个领域&#xff0c;最近由于项目的需要&#xff0c;需要对平面多边形进行剖分&#xff0c;特此对其作了些研究。 在对平面多边形进行处理的时候&#xff0c;很多时候需要知道多边形的凹凸性&#xff0c;本文介绍两种方法来…

最小凸多边形(凸包)

描述 给出平面上n个点的坐标&#xff0c;计算最远两点间的距离&#xff0c;以及包含所有点的最小凸多边形&#xff08;凸包&#xff09; 输入 第一行一个整数n&#xff0c;接下来是n行的实数对&#xff0c;表示n个点坐标。2<n<10000 n x1 y1 x2 y2 … xn yn 输出 输出…

计算机几何 - 如何判断一个多边形是凸多边形还是凹多边形

什么是凸多边形和凹多边形&#xff1f; 凸多边形&#xff1a;每个内角都是锐角或钝角&#xff0c;没有大于180度的内角(例如&#xff0c;三角形、正方形)。 凹多边形&#xff1a;至少有一个大于180度的内角(例如&#xff0c;五角星)。 注&#xff1a;大于180度的角又被称为优角…