[算法笔记]如何证明一个问题是NPC问题

article/2025/6/27 17:26:56

[算法笔记]如何证明一个问题是NPC问题

    • 步骤(Step)
    • 例子(Example)
    • 做题经验
    • 分析(Analysis)
    • 总结(Sum up)

步骤(Step)

在进入正题前,我想向大家讲解一下归约(reduction)、P和NP的概念。

期望(Desiderata’):假如我们能够在多项式时间(polynomial-time)内解决问题Y,我们考虑能在当前的基础下解决其他哪些问题呢?

归约(Reduction):当问题X能够在多项式时间内被归约为问题Y,并且对于任意问题X的样例能够被如下方式解决:
·多项式个标准的的算法复杂度计算步骤
·多项式次调用解决问题Y的步骤

标记(Notation):X ≤ P Y. (当碰到这个标记时,通常可以理解为Y比X难,并且Y可以解X)

推论:
1)若X ≤ P Y并且Y可以再多项式时间内解决,那么X可以再多项式时间内解决
2)若X ≤ P Y并且X不可以在多项式时间内解决,那么Y也不能在多项式时间内解决
3)若X ≤ P Y并且Y≤ P X,记作X ≡ P Y。在这种情况下,X能够在多项式时间内被解决当且仅当Y可以在多项式时间内解决

P问题
定义(Definition):一组每一个都拥有多项式算法的决策问题(即回答为是或否)通俗地说就是可以再多项式时间内解决的问题
NP问题
定义:一组每一个都存在多项式时间证书的(certifier)的决策问题。通俗地讲,就是在多项式时间可以被证明的问题。
所以P问题也是NP问题。所谓NPC问题也就是对于任意NP问题,都能够在多项式时间内归约成这个问题。也就是说比所有的NP问题都难(当然也有一样难的)
目前大多数学者认为NP问题真包含P问题,并且与NP-Hard问题有交集,交集即为NPC问题
在这里插入图片描述
Figure 0

一、证明NP
首先,对任意NP问题,都能成为NPC问题,但是如果单独给我们一个问题,让我们证明它是NPC问题确实有些困难,所以我们取巧。记这个问题为Y,先证明这个问题是NP问题

二、构造
找一个NPC问题,记为X,证明:X ≤ P Y

三、解的充要性
证明:X有解当且仅当Y有解

例子(Example)

根据难度,我提供两个解题例子供大家参考
一、
假如你准备安排这学期的课程并且想要保证,冲突的课程数不超过K。你有了3个输入:C={…},S={…},R={{…},{…},…}。C是一个包含不同课程的集合,S为所有课程可用的时间区间,R为学生的要求,包含了各个学生想要学的课程的集合(比如说有两个人,一个想学A,一个想学B,那么R={{A},{B}})。当两个课程被安排在一样的时间区间上发生冲突(即便有个学生两个都想学),证明这个问题是NPC问题

1.首先,对于任意的时间安排(作为证书。实际上,大多数证明证书都可以随便选,比如说你朋友的名字,虽然听起来非常离谱)。我们遍历所有学生的要求,并且检查他们的要求是否冲突了,并且数出冲突数目。最后检查总数是否小于K。以上的步骤可以再多项式时间内完成。(强烈建议把每一个步骤分开写,然后写上各自的复杂度)所以这个问题是NP。(证明多项式时间内可解,我们大多数时候都是选择最笨的方法,即遍历,然后证明遍历是多项式时间的)

2.我们选择三染色问题(3-Color问题。给一张图,用三种颜色给点染色,找一个染色方案,使得任意相邻的两点不同色)作为本题选中的NPC问题。对于任意三染色方案,记这张图为G,我们构造本题下的样例,:让每一个点代表一个课程,构造C;让(u,v)代表一个要求里有u,v的学生,构造R;让我们使用的颜色代表时间间隙,构造S;最后,设K为0

3.我们证明G为正确的三染色方案,当且仅当(C,S,R,K)为这个题目的正确的解:
LHS->RHS:若G为正确的三染色方案,那么按照课程的颜色安排他们。因为对于任意边(u,v),u和v会被不同的颜色染色,那么对于每一个学生,他的要求就不会被安排在相同的时间间隙下,这也意味着,这个方案是可行的

RHS->LHS:如果(C,S,R,K)是这个问题的解,那么将G中的点按照他们的时间间隙染色。因为K=0,那么对于所有学生,他们的要求之间没有冲突。这意味着对于每一条边(u,v),u和v不会被相同的颜色染色。所以这是三染色问题的一个正确染色方案。
综上,这个问题是NPC问题

是不是看的有点懵呢?这是我的作业里面比较难的一道题,所以大家不要灰心,下面给大家献上一道简单的题

二、4-COLOR

给定一个无向图和四种不同的颜色,我们能够提供一种染色方案,使得相邻的点颜色不同吗?证明4-COLOR问题是NPC问题

1.假设给定任意一种染色方案,首先将这个方案赋给G(O(|V|),V表示G的顶点数),我们在图中遍历这种方案,每遍历一个点时,判断它是否和它的邻点同色,由于各点的度数至多为|V-1|,所以这一步的复杂度为O(|V-1||V|)。所以这个问题可以在给定证书时多项式时间内解决。

在这里插入图片描述
Figure 1
实际上,有这幅图就够了,但是保险起见,还是为大家解释一下,添加一个点(θ(1)),将这个点赋为第四种颜色(θ(1)),将这个点与G中的点全部相连(θ(|V|)),我们得到一个四染色样例
3.
LHS->RHS:若三染色样例为真,那么将新的点v加入G,得到一种四染色方案

RHS->LHS:若四染色样例为真,那么将v与它和G的连边删去,得到一种三染色。
以上是我的作业的中文版本,但是作为一个合格的CS专业的学生,我建议大家多看看英文方面材料。我将我的作业的原版本放在下面,供大家参考

在这里插入图片描述
Figure 2

做题经验

我建议大家在做类似题目和准备考试的时候,多准备几个NPC问题,毕竟虽然所有NP问题都可以归约为NPC问题,但是归约的难度显然是不一样的
在这里插入图片描述
Figure 3

常见的有独立集(independent set)、集合覆盖(set cover)、顶点覆盖、哈密顿路(Hamilton road)、电路可满足性问题(circuit set,最古老的NPC问题)、团问题(clique)、旅行商问题、子集和问题(subset sum)、3-SAT(最经典的NPC问题)、三染色问题(3-C)还有一些其他的blablabla
在这里插入图片描述
Figure 4

在这里插入图片描述
Figure 5 3-SAT

分析(Analysis)

一般来说决策问题(Decision problem)弱于搜索问题(Search problem),而搜索问题弱于最优问题(Optimization problem)。但是这三者并没有无法逾越的界限。下面介绍一个例子
首先介绍一下顶点覆盖(Vertex cover),给定一个G=(V,E)和一个整数k,G的一个大小为k的顶点覆盖表示存在一个为k个点的子集,对任意G中的一条边,有一个点落在这个子集内部(用点覆盖所有的边)
在这里插入图片描述
Figure 6
如在这个图中,就有一个大小为4的顶点覆盖(白点集)
回到我想要讲的例子中:对图G

1)决策问题:是否存在一个小于等于k的顶点覆盖

2)搜索问题:找一个小于等于k的顶点覆盖

3)最优问题:找到最小的顶点覆盖

首先显然地,如果有3)的解,那么2)、1)迎刃而解,如果有2)的解,那么1)有解。下面我们仔细思考这三个问题,也许它们之间的差距并非那么大。
假如我们能够解1),我们通过如下步骤解2),对于图G,我们拿掉一个点,来看这剩下的图中是否有小于等于k-1的顶点覆盖,由于拿掉的这个点有|V|中选择,故我们可以对于这|V|个子图分别解决上面的问题,重复上面的步骤,可以根据我们拿出的点得到2)的解
OK,我们已经看到1)与2)的差距并没有那么大了,无非是遍历的问题,我们可以用动态规划解决(注意到先取v_1再取v_2和先取v_2再去v_1是相同的),当然这会在后面介绍。
现在我们假设知道了2)的解法,想知道3)的解,这个更加简单,只需要取k,k-1…,直到t的时候发现G中不存在小于t的顶点覆盖,那么G的最小顶点覆盖就是t+1,并且可以在取t+1时找到解

总结(Sum up)

总之,NPC问题就是很难的问题,但是在证明的时候可以站在前人的肩膀上,用已有的NPC问题来证明,2021结束了,我在2019年许下的愿望之一就是五年内开个博客,这是我的第一篇,由于平时学业很忙,所以只有在假期才能写一点,虽然老师教了NPC问题,但是感觉学得并不是很深,有兴趣的兄弟们可以找点论文和书籍看一下,最后川宝倒了,祭奠一下川宝,呜呜呜
在这里插入图片描述


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

相关文章

npc内网穿透

备注:使用npc工具做内网穿透需要一台带公网的服务器作为服务端,在带公网IP的服务器为服务端,安装nps服务。在内网服务器安装npc客户端 安装使用地址:https://ehang-io.github.io/nps/#/ 下载地址:https://github.com/e…

unity3d如何量产npc

文章目录 1.技术概述2.技术详述2.1 修改预制体2.2放置预制体2.3开始量产 3.技术使用中遇到的问题和解决过程。3.1第一个npc脚没落地 4.进行总结。 1.技术概述 在unity3d游戏制作过程中,常常需要用到大量的剧情npc,特别是遇到,军训等大场面&a…

【npc实现代理】

nianzii is real !!!!!!!!哈哈哈哈哈哈,又到了快乐的时光了。今天给大家分享 自己在使用npc时候的一些步骤和方法。在此之前我先给大家分享一个白嫖别人nps的方法:fofa搜索 :app"nps" 即可出现一大堆没有隐藏网站指纹的nps网站的登…

计算传奇客户端中NPC外观代码的方法

每个NPC的外观都是由传奇客户端中的NPC.wil.文件提供素材,NPC.wil文件素材内综合了很多的图片。今天的教程,将教大家如何计算NPC外观代码. 首先,我们需要WIS编辑工具打开我们客户端中的npc.wil文件,查看我们需要的NPC外观图片编号…

计算机控制什么是npc,游戏里的npc是什么意思

游戏里的npc是什么意思?很多玩家在讨论游戏时会提到npc这个词,有些玩家不太理解该词的意思,想要了解,下面为大家介绍一下游戏里的npc的意思,想了解的玩家快来看看吧。 游戏里的npc是什么意思 NPC是Non-PlayerCharacter…

计算机控制什么是npc,npc是什么意思

很多朋友在玩游戏的时候,都有接触到npc,那么有人就要问了,npc是什么意思?它有什么作用呢?下面我们就来简单介绍一下。 npc是什么意思?概念如下: npc的全称是Non-Player Character,也就是非玩家控制角色的缩写。这个…

海盗王实现随身NPC功能

曾经玩过一个海盗王的服,它里面有个随身NPC交易的功能。 一般正常情况下,是在城里或者野外,来到一个NPC旁边,点击打开交易功能,才能进行物品的购买和出售。随身NPC可以在身边没有NPC的情况下,通过工坊的按…

游戏经济系统分析:通货与交易

来自GameRes,转载请标明出处:http://www.gameres.com/689338.html 文/旭曜灵 接上篇《 《PoE》的技能串联与体验设计:《Diablo II》的另一种诠释 》,这次是PoE系列的最后一篇,终于要来谈它特殊的经济系统了&#xf…

python中科学计数法怎么表示_python科学计数法转换

python 输出数字,如何不以科学计数法输出? 概述利用numpy设置输出选项即可 代码解析 未使用numpy设置: import time # time 时间类 print(time*time*1000) #输出一个非常大的数字 #out: 6.30e1352 由此可以看到,默认输出是以科学计数方式输出 使用numpy设置print的输出选项…

MATLAB临时关闭科学计数法显示

MATLAB临时关闭科学计数法显示,在format命令后加g即可解决,如: >> format long g

科学计数法

1.应用场景 较大较小数字表示&#xff0c;在一些算法中被用到。 如计算2^64&#xff0c;编程语言基本都是使用科学计数法表示结果。 2.介绍 科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式&#xff08;1≤|a|<10&#xff0c;n为整数&#xff09;&…

matlab 坐标不用科学计数法,matlab不用科学计数法

『壹』 matlab中怎么才能不是科学计数法表示结果。比如1.0e003 * 2.7581&#xff0c;怎么使它显示为2758.1谢谢了&#xff0c;很急啊 format long (小数位14) 或 format short(小数位4) 『贰』 matlab中科学计数法怎么表示 在matlab中&#xff0c;科学计数法用如下形式表示&…

计算机科学计数法符号,科学计数法怎么表示

科学计数法怎么表示2019-09-26 16:35:10文/陶凯月 科学计数法就是用幂的方式来表示。科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10&#xff0c;n为整数)&#xff0c;这种记数法叫做科学记数法。 科学记数法是一种记数的方法。把一个数表示成…

计算机输出科学计数法,python不用科学计数法

❶ Spyder集成开发环境中,Python绘图如何让Y轴不以科学计数法显示 很简单只需两个语句: import numpy as np np.set_printoptions(suppress=True) 这样就可以搞定! ❷ python 输出数字,如何不以科学计数法输出 概述 利用numpy设置输出选项即可 代码解析 1、未使用numpy设置…

C语言科学计数法介绍和示例

文章目录 1、科学计数法2、获取视频教程3、版权声明 1、科学计数法 在实际开发中&#xff0c;我们很少使用科学计数法&#xff0c;但是它经常出现在计算机系统中&#xff0c;例如浮点数在内存中的存放方式就是科学计数法&#xff0c;所以我们还是有必要学习科学计数法。 科学…

mysql查出来科学计数法_数据库字段出现科学计数法e+的情况分析

问题: 有时候,我们在将excel表格中数据导入数据库中时,对于表格中的数字会默认为float的数据类型,这个时候导入到数据库中的这个表的值是正常显示的; 然而如果你要把导入到数据库中的表,再插入到另一个表中,并且对应的字段如果是char、varchar或者是nvarchar等类型时,并…

C语言科学计数法E格式

记住口诀 e前e后必有数&#xff0c;e前为小数可以省略整数部分或者小数部分&#xff0c;e后必须为整数&#xff0c;中间不能加空格 e前为小数省略小数部分 e前为小数省略整数部分 e后不为整数不合法 e前为小数同时省略整数部分和小数部分不合法 用空格隔开不合法

C语言-求阶乘的两种方法

目录 方法一&#xff1a;递归法求阶乘 方法二&#xff1a;循环法求阶乘 main及结果 方法一&#xff1a;递归法求阶乘 long Factorial_way1(int m){if(m1)return 1;else{return m*Factorial_way1(m-1);}}方法二&#xff1a;循环法求阶乘 long Factorial_way2(int m){long su…

c语言中实现阶乘的方法,c语言实现阶乘的方法

c语言实现阶乘的方法 从键盘输入一个数&#xff0c;求出这个数的阶乘&#xff0c;即 n!。 算法思想 首先要清楚阶乘定义&#xff0c;所谓 n 的阶乘&#xff0c;就是从 1 开始乘以比前一个数大 1 的数&#xff0c;一直乘到 n&#xff0c;用公式表示就是&#xff1a;1234…(n-2)(…

C语言求阶乘案例教程

思路分析&#xff1a; 1.我们先搞清楚阶乘是什么&#xff0c;怎么用数学符号表示出来。 我们看百度百科对阶乘的介绍。 “一个正整数的阶乘是所有小于及等于该数的正整数的积&#xff0c;并且0的阶乘为1。自然数n的阶乘写作n!” 举个例子&#xff1a;求3的阶乘就是3!1*2*36 …