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

article/2025/9/18 10:15:50

目录

基本概念

证明思路

常见例子

21个常见NPC问题

原理论证


基本概念

P问题:(polynominal)    存在多项式时间算法的问题,即在多项式时间内可解的问题;

   例如:冒泡排序、快速排序等问题;

NP问题:(Nondeterministic polynominal在多项式时间内验证出一个正确解的问题,也就是说这个问题不一定在多项式时间内可解,但可以在多项式时间内验证;

   例如:大数分解问题,比如180576这个数让你拆成两个数相乘,必须是三位乘以三位的,可能很久都解不出来(如果是一个很大很大的数的话),但是我告诉你这是352*513得到的,那么很简单就能在多项式时间内验证是否正确,这就是NP问题;

 

NPC类问题Nondeterminism Polynomial complete):存在这样一个NP问题,所有的NP问题都可以约化成它。  

NP-Hard类问题Nondeterminism Polynomial hard):所有NP问题都可以约化成它。

这里插一句,何为约化,以及两者的具体解释我在下面给出,但是可以看的所谓的NP完全问题和NP难问题的唯一差别就是这个问题本身是不是NP问题。然后两者都是可以被所有NP问题约化的。那也就是说,NP-H问题是包含NPC问题的,而NPC又至少是一个NP问题,那么它也被NP包含,但NP-H问题不一定是NP问题,所以有一部分NP-H问题是NP,有一部分不是,这样整个概念相互包含与相交的逻辑就出来了,如下:

因此说了这么多,个人认为为什么要判断一个问题是哪类问题,原因在于,它有助于让我们在决心实现这类问题之前对问题的难易程度进行一个有效的判断。如果一个问题是一个NP难问题,众所周知我们是不一定能够找到最优解的,有时候持有次优解即可。如果一个问题连NP问题都不是,也就是说我在多项式时间内连验证它都很费劲,又谈何解决出来呢?这类问题就不大有研究的必要了;

证明思路

前面的概念留了一个点,说NP-H问题和NPC问题都是所有NP问题可以约化到的,那么究竟什么是约化?我了解到的:B能解决A,那么就说A可以约化到B,也就是说,B是一个复杂度比A更高的算法,B通过某种特殊情况(简化),可以变成A问题,比如B问题是二元一次方程,A问题是一元一次方程,当B问题,y=0时,它就转变成了一元一次问题。也就是说B问题能解决A,那么就说A问题可以约化到B;

那说了这么多,NPC的或者NP-H问题的证明思路究竟是什么呢?首先我要先判断一下这个问题本身是不是NP问题(给出一个解能否在多项式时间内验证),然后找到一个已知的NPC问题去约化到这个问题,因为我去验证一个问题,把所有NP问题都约化一遍到我这个问题上不太可能,而NPC问题本身的定义就是所有NP问题可以约化到它,那我拿一个已知的NPC问题,去验证这个NPC问题可以约化到它,即

                 所有NP问题->已知的NPC问题->亟待解决的新问题;

这样,也就简化了我去验证一个新问题是不是NPC问题的方式;

证明是NP-Complete 问题:                                                                        证明是NP-Hard 问题:

①证明本身是NP问题;                                                                               ①无需证明本身是NP问题;

②证明一个已知的NPC问题能约化到它                                                       ②证明一个已知的NPC问题能约化到它;

 

常见例子

说了这么多,再来两个例子来巩固一下:

首先是一个诱导子图的问题,问题描述在第一行,那么想证明这个问题是不是NPC问题(是NPC就一定是NP-H了),首先判断它是不是NP问题,那么给出一个子图包含K个点,问你是否最少包含l条边,很容易就能验证,即在多项式时间内可以验证,是NP问题。

其次,找到一个已知的NPC问题,验证这个已知的NPC问题可以约化到这个新问题,那么就能证明他是NPC问题了(即找到一个特殊情况把这个问题简化到已知的NPC问题)

那么当l=C_{k}^{2}时,该问题就变成了找一个K大小的完全子图(因为完全子图边和顶点的关系就是C_{k}^{2}),而找完全子图的问题也称Clique问题,是一个已知的NPC问题,那么通过设定l的特殊取值,将待解决问题转化成了现有NPC问题,即由一个NPC问题约化而来,本例得证;

 

2.

In the HITTING SET problem, we are given a family of sets {S1, S2, . . . , Sn} and a budget b, and we wish to find a set H of size b which intersects every Si , if such an H exists. In other words, we want HSi ∅ for all i.

Show that HITTING SET is NP-complete.

大概的意思就是这是一个碰撞集问题,这个集合H跟Si的各个集合都相交:

 

然后来证明他是一个NPC问题:

①首先证明它是一个NP问题,像我上图一样,如果给出了一个集合H,问你它是否跟所有的Si都相交,那么这是在多项式时间内可以验证的;即是NP问题;

②证明一个已知的NPC问题可以约化到它:

   当我把Si集合特殊化,即我把每条边当成一个Si,集合的元素就是每条边的两端,更改后图如下:

然后把问题变成,找该图中的最小顶点覆盖问题(Vertex cover),即找到的集合包含图中每条边的至少一端。这样也满足了我的集合H和所有Si集合都相交(将Si集合特化成一条边的作用),那么我亟待解决的问题就特化成了已知的NPC问题——最小顶点覆盖问题。那么本例得证;

21个常见NPC问题

既然现有的方式是找到一个已有的NPC问题去验证我要验证的新问题,那么知道了解现有的NPC问题就变得很重要,下面列举了常见的NPC问题,而每个子主题(往后错一格)代表这我可以由前面的主题约化而来:

可以看到,这些问题约化来约化去,都是有一个初始问题的,因为一个问题由另一个已知的NPC问题约化而来,那么第一个NPC问题是怎么来的?那就要用到NPC问题的本身定义了:所有的NP问题可以约化到它;

这个方式就是经典的SAT问题,由上图也可以看到,这些已有的NPC问题它的最开始,都是用SAT问题证明的;

原理论证

证明了所有的算法都是可以编码为boolean formula(布尔型)问题,这意味着所有算法都可以使用SAT求解,因为他们本质上就是boolean formula问题。

 

对于任意的boolearn foumula成以下标准式:                

                                          (..∨...∨..)∧(..∨...∨..)∧...

                                                           SAT:如何取值,使式子为真?或根本         

                                                                  不存在一个取值使式子为真。

这些话是我做的ppt里写的,直接拷过来,意思就是,这所有算法无外乎就是在一个给定集合中找到解,或者无解,而这些算法的选择,条件等等都是可以编码为布尔型,用合取范式的方式表述这个算法的情况,算法有解,就代表合取范式为真,算法无解,就代表这个式子取值为假。

具体还是看例子,用SAT模型去证明我上面所说的Clique问题:

首先看这个图,我要找它的k=3 的clique也就是完全子图,答案先放在这(b、c、d)

那现在将他编码为布尔型,任意编码,但边代表着我的相邻节点必须可以同时为真,像a,b可以同时取值为X1,X2,但不能同时取值X1和,然后图就变成下图:

编完码后,将其写成SAT的合取范式模型,这里因为k=3,所以合取范式里的析取范式个数为3,搭配是任意的:

写完后,找到一个k=3的clique,就变成了找到这个合取范式为真的情形。是单独的,所以它必须为真,那么X1就是假,那X2就必须为真,为假,那么X3就必须为真,由此得出,编码bcd为真,即k=3的clique找到了;

 

以上就是NP问题的概念+证明逻辑+例子,当然自己只是浅显的学习,如果有错误或者论证思路不严密,还望赐教;

 

注:我这里一直再说NPC NPC,因为NPC是包含在NP-Hard问题里的,很多人所讲的这个问题是np难的,其实就是NPC问题,因为NPC比np难多了一个问题本身是NP的,如果这个问题你连验证都验证不了,又谈何解决呢?


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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

凸多边形的划分

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

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

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

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

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

判断点在凸多边形內

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

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

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

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

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

判断平面多边形的凹凸性

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

最小凸多边形(凸包)

描述 给出平面上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度的角又被称为优角…

多边形扩展和收缩(凸多边形和凹多边形)

目录 背景介绍&#xff1a;知识积累&#xff1a;思路点拨&#xff1a;代码区域&#xff1a; 背景介绍&#xff1a; 如下图所示&#xff0c;黑色是原多边形&#xff0c;红色是扩展的多边形&#xff0c;蓝色是收缩的多边形。这是最终的效果。 PS&#xff1a;楼主使用的是ES6的语…

什么是凸多边形和凹多边形

GIS有时需要用算法判断线段是否在多边形内&#xff1b; 最基本的出发点如下&#xff0c; 线段在多边形内的一个必要条件是线段的两个端点都在多边形内&#xff0c;但由于多边形可能为凹&#xff0c;所以这不能成为判断的充分条件&#xff1b; 就是说&#xff0c; 如果线段的两…

判断多边形是凹多边形还是凸多边形,以及求凹点

转载&#xff1a;计算机几何 - 如何判断一个多边形是凸多边形还是凹多边形_刘建宁的博客-CSDN博客_凹多边形和凸多边形的区别 重点&#xff1a; 1.凸多边形指的是多边形的每个内角小于180度。 2.凹多边形指的是至少有一个内角大于180度。 判断多边形性质 多边形内角和等于(n…

凸多边形最优三角

前言&#xff1a;大三下算法课&#xff0c;自己看的凸多边形最优三角&#xff0c;最后上台讲解&#xff0c;和子涵苗子等一起的一段时间 1.相关概念 • 凸多边形&#xff1a;一个简单多边形及其内部构成一个闭凸集时&#xff0c;则 称该简单多边形为一个凸多边形。 • 边&#…