经典「 P问题、NP问题、NPC问题、NP-hard问题详解」

目录

一、多项式时间复杂度

二、确定性算法与非确定性算法

三、规约/约化问题

四、P类问题、NP类问题、NPC问题、NPH问题

1、P类问题

2、NP类问题(Non-deterministic Polynomial Problem,非确定性多项式问题)

3、NPC问题(NP完全问题)

4、NP-hard问题(NPH问题,NP难问题)

五、 组合最优问题(我个人只作了解)

六、讨论P是否等于NP的问题


作者为什么会遇到NP-hard问题,如何接触到这个概念的?读论文时看到×××为NP-hard问题,希望下面的叙述会对大家有帮助。

要理解P问题、NP问题、NPC问题、NP-hard问题,需要先搞懂以下几个概念:

  • 多项式时间指的是什么?
  • 确定性算法是什么?非确定性算法呢?
  • 什么是规约/约化?

一、多项式时间复杂度

时间复杂度就是指算法运行所花的时间,但当程序所处理的问题规模变大或数据规模变大,程序所需的时间长度对应增长得多快。对于某一个程序,不能仅靠处理特定数据的效率衡量该程序的好坏,而应该关注当数据规模变大之后程序的运行时间是否还是一样,或者变慢的程度。

由于时间复杂度前面根本不会出现系数,所以也不会出现类似于O(2*n^{3})这样的时间复杂度,整个系统的时间复杂度是随着n变化的,不会随着前面的系数2发生变化的,整个系统的时间复杂度也可以进行拆分为多个部分的求和,例如O(n^{2}+n)的复杂度其实也就是O(n^{2}),所以通常就认为说O(0.001*n^{3})

多项式时间复杂度(解决问题需要的时间与问题的规模间是多项式关系)的多项性主要体现在取指数最高的项作为时间复杂度的表达式,当然若不删除低指数项不就可以看出多项式的多项行了吗。

O(1),O(n^{a})等,这是一些多项式级复杂度;像指数级或阶乘这样的复杂度即为非多项式级的复杂度,其复杂度计算机往往不能接受[1]。

二、确定性算法与非确定性算法

确定性算法是指在用某算法解决问题时,在整个过程中每一步都能得到一个确定的解。

非确定性算法是指使用某算法在求解问题时,它将问题分解成两部分,分别为猜测和验证阶段,

三、规约/约化问题

问题A可以约化为问题B,则称为问题A可约化为问题B。核心就是把求解问题A转化为求解问题B,问题B的解一定就是问题A的解,且求解问题A不会难于解决问题B,因此,问题B的时间复杂度要高于问题A。

下面以一个实例分析一下,求解一元一次方程y=ax+b和求一个一元二次方程y=ax^{2}+bx+c。那么求解前者可以规约为求解后者,意思就是求解出一元二次方程的方法则一定能求解出一元一次方程。按照某种规则(将一元二次方程二次项的系数变为0)即可求解出一元一次方程,这种方式则是把求解一元一次方程问题规约为求解一元二次方程。

总结:从上述例子可以看出,使用规约方法不断规约某一问题后,会使得适用范围更广、复杂度更高的算法代替使用范围更小,复杂度更低的算法。

四、P类问题、NP类问题、NPC问题、NPH问题

1、P类问题(Polynomial Problem)

指的是在多项式时间范围内能解决的问题。

2、NP类问题(Non-deterministic Polynomial Problem,非确定性多项式问题)

所有非确定性问题都只能通过验证猜测来求解。

NP类问题指的是在多项式时间内“可验证”的问题,也就是不能判断这个问题到底有没有解,而是猜出一个解在多项式时间内证明这个解是否正确,即该问题的猜测过程是不确定的,而对其某一个解的验证需要在多项式时间内完成。P问题属于NP问题,但NP问题不一定属于P问题。

3、NPC问题(NP完全问题)

存在一个NP问题,并且所有的NP问题都可以规约为它。换句话说,只要是解决规约后的问题,那么所有规约之前的问题都可以解决(大范围->小范围),并且针对的不只是一个问题,针对的是一类问题。

两个限制条件:

  • 均为NP问题。
  • 所有NP问题都能归约到它。

4、NP-hard问题(NPH问题,NP难问题)

NP-hard问题指的是满足NPC问题的第二个条件但不一定满足第一个条件,也就是说,NP-hard问题的范围要比NP问题范围广,也就是说所有的NP问题都可规约为此问题,但此问题不一定为NP问题。

所以,NP-hard问题指的就是对于一个问题S,满足任何NP问题都可以在多项式复杂度范围之内被规约为S,当解决问题S是,所有NP问题就都被解决,可以认为这是一个比所有NP问题都难的问题。

1、下面举个例子,理解一下什么是NP-hard问题,

2、以上的四个问题(P、NP、NPC、NP-hrad)间的关系如下所示,

 其实,NP-hard即使世界七大数学难题之首

五、 组合最优问题(我个人只作了解)

组合最优问题是一类在离散状态下求极值的问题。把某种离散对象按照某个确定的约束条件进行安排,当已知合乎这种约束条件的特定安排存在时,寻求这种特定安排下的在某个优化准则下的极大解和极小解问题。

六、讨论P是否等于NP的问题

前言:数据结构和算法是紧密相关的,算法就是一种解决问题或执行一些特定任务的一系列操作把对应的输入转换为输出,数据结构(线性表、栈、队列、树等)为算法服务,也就是算法可以选择合适的数据结构在特定的问题上提高算法效率。那么,算法的复杂度通常是指输入与输出的转换速度。

从离散数学的角度,若要证明两个集合A, B是否相等,则需要保证:

  • A\subseteq B
  • B\subseteq A

1、P\subseteq NP:在执行一段特定的程序时(若有if-else结构时),执行到判断分支时,紧跟在判断分支后的情况只有一种应该被执行,也就是在每个分支对应的节点处只能确定性的走一条路径。P类问题指的是在多项式范围内可解决的问题,NP问题指的是在多项式时间内可验证的问题。NP问题一定是包含P问题的。

2、NP\subseteq P:下面证明P问题是否包含NP问题,只需要证明能否用确定性的算法在多项式范围时间内解决非确定性算法在多项式时间范围内解决的问题。由于多项式与多项式的大小又随着问题的规模大小变得大小不一,因此仅使用多项式这一笼统的概念描述复杂度也是一个不准确的做法。

对此,再大的多项式复杂度比如O(n^{1000})也不能和再小的指数复杂度O(e^{n})相比,因为随着问题的规模n不一样,总会有e^{n}> n^{1000}。若问题规模需要达到相当相当大程度时,指数级复杂度才会超过多项式复杂度的话,那我们不如就用指数级的复杂度。所以P=NP的问题关键就在于并没有针对实际需求,而是在初始条件就假设有“无穷大”的规模,“无穷多”的耐心,使得最终的多项式时间算法最终有优势,所以目前普遍认为P=NP不成立,多数人相信,存在至少一个不可能有多项式级复杂度的算法的NP问题。

Reference

[1]http://t.csdnimg.cn/6mH9x

[2]http://t.csdnimg.cn/i9HFe

[3]http://t.csdnimg.cn/EyhHJ

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值