关于P、NP、NPC、NP-Hard问题的一点理解

相信经常看论文的科研人,对NP-Hard这个词都不陌生,特别是计算机专业的小伙伴。每次见都感觉对NP-Hard不太熟,认识有点模糊,于是花时间查了下资料,记录下一点认识。

预备知识:

首先得明白,P、NP、NPC、NP-Hard这几个概念都是与时间复杂度有关的,同时NPC和NP-Hard这两个概念又与归约(约化)有关,所以先把这两部分内容作为预备知识介绍一下。

时间复杂度

表明问题规模扩大后,程序需要的时间长度增长得有多快。程序的时间复杂度一般可以分为两种级别:

  • 多项式级别的,如O(1),O(n),O(log(n))。这种级别的算法程序是我们能用的;
  • 非多项式级别,如O(a^n),O(n!)。这复杂度直接起飞,所以计算机顶不住,那么我们一般也不用

规约/约化(Reducibility) 

简单的说,一个问题A可以约化为问题B的含义是,可以用问题B的解法解决问题A。(个人感觉也就是说,问题A是B的一种特殊情况。)标准化的定义是,如果能找到一个变化法则,对任意一个A程序的输入,都能按照这个法则变换成B程序的输入,使两程序的输出相同,那么我们说,问题A可以约化为问题B。

例如求解一元一次方程这个问题可以约化为求解一元二次方程,即可以令对应项系数不变,二次项的系数为0,将A的问题的输入参数带入到B问题的求解程序去求解。

另外,约化还具有传递性,A可以化约为B,B可以约化为C,那么A也可以约化为C。

 

基本定义

  • P Problem: 对于任意的输入规模n,问题都可以在n的多项式时间内得到解决;
  • NP(Non-deterministic Polynomial) Problem: 可以在多项式的时间里验证一个解的问题;(也就是说NP只关心能否在多项式的时间里验证某个问题,不关心这个问题是否有多项式时间的解)
  • NPC(Non-deterministic Polynomial Complete) Problem: 满足两个条件 (1)是一个NP问题 (2)所有的NP问题都可以约化到它
  • NP-Hard Problem: 满足NPC问题的第二条,但不一定要满足第一条

 

 

详解

P Problem

如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题,即算法的时间复杂度是多项式级的。比如n个数中间找到最大值,或者n个数排序之类的。

NP Problem

NP问题的另一个定义是可以在多项式的时间里猜到一个解的问题,例如求问图中起点到终点是否有一条小于100个单位长度的路线,随便选一条,如果算出来路径小于100,那么就猜到了一个解,也就是说如果你运气足够好的话就可以在多项式时间内解决这个问题。当然猜的前提是问题存在解。

再比如Hamilton问题,给定一幅图,是否能找到一条经过每个顶点一次且恰好一次最后又走回来的路,每条路都可以在多项式时间内判断这条路是否恰好经过了每个顶点,所以也是NP问题。

很显然,所有的P类问题都是NP问题,能在多项式时间内解决,必然能多项式地验证一个解。(NP是否等于P这个问题貌似还没有定论?)

NPC Problem:

证明一个问题是NPC问题的步骤,就是根据它的定义,证明以下两点:(1)先证明其为NP问题,(2)再证明其中一个已知的NPC问题能够约化到它。(这里解释下:根据约化的传递性,即:所有NP问题→已知的NPC问题→现在要证明的问题,就可以满足定义中的第二条)。

NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。

关于具体NPC问题,可以看文末的资料。

NP-hard Problem

 NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广)。NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。(也就是说NP-Hard可能不是NP问题,那么它连在多项式时间内去验证都做不到,所以比NPC问题更难,NPC起码是NP问题,能在多项式时间内去验证)

 

总结:许多论文中提到某个问题A属于NP-hard问题,个人认为想表达的意思是:问题A求解困难,目前找不到多项式时间内的解法,因此只能寻找一种近似解法,或者说是次优解,来在能够承受的时间范围内较好地解决这个问题。(可能不是最优解,但已能够满足解决问题的需求。就像我们在生活中遇到了问题,我们总会想办法去解决,即使这个办法并非最优,但能在一定程度上解决就可以啦)

 

参考资料:

  1. https://hujichn.github.io/2016/07/14/%E4%BB%80%E4%B9%88%E6%98%AFP%E3%80%81NP%E3%80%81NPC%E3%80%81NP-Hard%E9%97%AE%E9%A2%98/
  2. http://www.matrix67.com/blog/archives/105
  3. https://blog.csdn.net/huang1024rui/article/details/49154507?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base
  4. https://www.zhihu.com/question/27039635

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值