P、NP、NPC、NP-hard概念理解

本文深入探讨了算法的时间复杂度,从O(1)到O(n!)的级别,阐述了P问题(能在多项式时间内解决的问题)、NP问题(能在多项式时间内验证解的问题)以及NPC问题(NP完全问题)的概念。重点讨论了约化在NPC问题中的作用,同时介绍了NP-hard问题,它们是至少与NPC问题同样复杂的问题,即使NPC问题找到多项式算法,NP-hard问题可能仍无法有效解决。
摘要由CSDN通过智能技术生成

一、四者的包含关系

P、NP、NPC、NP-hard包含关系

二、从时间复杂度说起

算法的时间复杂度是一个函数,它定性描述该算法的运行时间,常用大 O O O符号表述,不包括这个函数的低阶项和首项系数。

(1)对于一个循环,假设循环体的时间复杂度为 O ( n ) O(n) O(n),循环次数为 m m m,则这个循环的时间复杂度为 O ( n × m ) O(n×m) O(n×m)

(2)对于多个循环,假设循环体的时间复杂度为 O ( n ) O(n) O(n),各个循环的循环次数分别是 a , b , c . . . a, b, c... a,b,c...,则这个循环的时间复杂度为 O ( n × a × b × c . . . ) O(n×a×b×c...) O(n×a×b×c...)。分析的时候应该由里向外分析这些循环。

(3)对于顺序执行的语句或者算法,总的时间复杂度等于其中最大的时间复杂度。

(4)对于条件判断语句,总的时间复杂度等于其中时间复杂度最大的路径的时间复杂度。

时间复杂度从低到高可以被分为两种级别,前者是多项式级的复杂度,例如 O ( 1 ) , O ( l o g ( n ) ) , O ( n a ) O(1),O(log(n)),O(n^a) O(1),O(log(n)),O(na)等(n出现在底数的位置);后者是非多项式级的,例如 O ( a n ) 和 O ( n ! ) O(a^n)和O(n!) O(an)O(n!)型,其复杂度计算机往往不能承受。

然而,不是所有的问题都可以找到复杂度为多项式级的算法,有些问题甚至根本不可能找到一个正确的算法。由此引入P、NP等概念。

三、P问题

如果一个问题可以找到一个能在多项式的时间内解决的算法,那么这个问题就属于P(Polynomial)问题。

四、NP问题

NP问题是指可以在多项式的时间里验证一个解的问题。有些问题中,找一个解很困难,但验证一个解很容易(例如,求两个节点间距离小于xx的路径)。

很显然,所有的P类问题都是NP问题,但NP≠P。能多项式地解决一个问题,必然能多项式地验证一个问题的解;反之不成立。

五、NPC问题

1.约化(Reducibility)

一个问题A可以约化为问题B的含义即是,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。

“问题A可约化为问题B” 有一个重要的直观意义:B的时间复杂度高于或者等于A的时间复杂度。

很显然,约化具有一项重要的性质:约化具有传递性。如果问题A可约化为问题B,问题B可约化为问题C,则问题A一定可约化为问题C。

约化的标准概念: 如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可约化为问题B。

当然,我们所说的“可约化”是指的可“多项式地”约化(Polynomial-time Reducible),即变换输入的方法是能在多项式的时间里完成的。约化的过程只有用多项式的时间完成才有意义。

从约化的定义中我们看到,一个问题约化为另一个问题,时间复杂度增加,问题的应用范围也增大。通过对某些问题的不断约化,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。

2.NPC

NPC问题同时满足以下两个条件:(1)是NP问题;(2)所有的NP问题都可以约化到它。

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

六、NP-hard问题

NP-Hard问题满足NPC问题定义的第二条但不一定要满足第一条。

NP-Hard问题同样难以找到多项式的算法,但它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值