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

请您思考:
1、哪个是基础问题?
2、如果从集合的角度考虑,它们会是什么关系?
3、区别它们关系的核心是什么?


一、相关知识
1、复杂度有两种级别
  • 多项式级别:类似于O(1),O(log2n),O(na),规模n出现在底数的位置,我们称为多项式级的复杂度

  • 非多项式级别:类似于O(n!),O(an),规模n出现在底数的位置,我们称为非多项式级的复杂度

非多项式复杂度 远远大于多项式复杂度

2、规约(Reducibility)

使用规约,最重要的是找到一个规则,用这个规则来规约父问题和子问题。

1、含义
一个问题A可以规约为问题B的含义即是,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。直观意义O(A)<=O(B),也就是说,问题A不比问题B难。
这很容易理解。既然问题A能用问题B来解决,倘若B的时间复杂度比A的时间复杂度还低了,那A的算法就可以改进为B的算法,两者的时间复杂度还是相同。正如解一元二次方程比解一元一次方程难,因为解决前者的方法可以用来解决后者。

2、举例
现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以约化为后者,意即知道如何解一个一元二次方程那么一定能解出一元一次方程。我们可以写出两个程序分别对应两个问题,那么我们能找到一个“规则”,按照这个规则把解一元一次方程程序的输入数据变一下,用在解一元二次方程的程序上,两个程序总能得到一样的结果。这个规则即是:两个方程的对应项系数不变,一元二次方程的二次项系数为0。按照这个规则把前一个问题转换成后一个问题,两个问题就等价了。

二、概念介绍

1、P问题
如果一个问题可以找到一个能在多项式复杂度里解决它的算法,那么这个问题就属于P问题。

2、NP问题
NP问题是指可以在多项式复杂度里验证一个解的问题。NP问题的另一个定义是,可以在多项式的复杂度里猜出一个解的问题。

3、NPC问题(NP完全问题)
(1)同时满足:

  • 得是一个NP问题;
  • 所有的NP问题都可以约化到它。

(2) 举例
旅行商问题和集合覆盖问题都是NP完全问题。


(3)如何识别NP完全问题

  • 元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。

  • 涉及“所有组合”的问题通常是NP完全问题。

  • 不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。

  • 如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。

  • 如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。

  • 如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题。

4、NP-Hard问题
它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广)


三、四者关系

集合
很显然,所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。

关键是,人们想知道,是否所有的NP问题都是P类问题(注意:跟“所有的P类问题都是NP问题”表述的顺序是不同的)。

我们可以再用集合的观点来说明。如果把所有P类问题归为一个集合P中,把所有 NP问题划进另一个集合NP中,那么,显然有P属于NP。现在,所有对NP问题的研究都集中在一个问题上,即究竟是否有P=NP?通常所谓的“NP问题”,其实就一句话:证明或推翻P=NP。

从NPC定义上看,所有的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个多项式复杂度算法解决了,同时,P问题也是多项式复杂度算法解决的,所以NP也就等于P 了。因此,给NPC找一个多项式算法太不可思议了。那么,前文说,“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。

四、总结

所有P问题都是NP问题,反之则不一定。npc问题是np问题的子集,也是p问题和np问题的差异所在。如果找到一个多项式内能被解决的npc问题的解决方法,那么P=NP。

Reference

1、什么是P问题、NP问题和NPC问题
2、怎么理解 P 问题和 NP 问题?
3、算法导论

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页