P问题、NP问题、NPC问题(NP完全问题)、NPH问题和多项式时间复杂度

本文介绍了多项式时间复杂度的概念及其与P问题、NP问题、NPC问题的关系,解释了NP问题的验证特性及NPC问题的重要地位。

1.多项式时间复杂度

定义: 解决问题需要的时间与问题的规模之间是多项式关系。

多项式关系形如 O(nk) ,k为某个常数,n是问题的输入规模。例如,时间复杂度为O(nlog(n))、O(n^3)都是多项式时间复杂度。时间复杂度为O(n^log(n))、O(2^n)是指数时间复杂度,O(n!)是阶乘时间复杂度。像O(a^n)和O(n!)型的时间复杂度,它是非多项式级的,其复杂度计算机往往不能承受。

为什么多项式时间复杂度的定义形式是 O(nk) 呢,它的多项式的多项性体现在哪呢?

因为算法的时间复杂度的表达式 O(nk) 可以为 O(nk+nk1) ,在表示时 O(nk)=O(nk+nk1) ,取指数最高项保留作为时间复杂度的表达式,未删除低指数项就可以看出多项式的多项性了吧!当然,单项式也算作多项式。

注:图G的顶点个数称为图G的阶(Order)。

2.P问题

《算法导论》给出的定义:在多项式时间内可解的问题为P问题(Polynomial Problem,多项式问题)。

更为具体的是:P问题指可以在多项式时间内求解的问题,例如:时间复杂度为O(nlog(n))的快速排序和堆排序, O(n2) 的冒泡排序和直接选择排序算法都是P问题,也就是多项式时间算法。相反,时间复杂度为 O(nlogn) O(2n) 的算法是指数时间算法。

3.NP问题

定义: NP问题((Non-deterministic Polynomial Problem,非确定性多项式问题),指问题只能通过验证给定的猜测是否正确来求解。所谓多项式指的是验证猜测可在多项式时间内完成,所谓非确定性指的是问题只能通过验证猜测来解,而不能直接求解。

如Hamilton回路是NP问题,因为验证一条路是否恰好经过了每一个顶点可在多项式时间内完成,但是找出一个Hamilton回路却要穷举所有可能性,不能直接求解。

又如大合数的质因数分解,没有给定的公式可直接求出一个合数的两个质因数是什么,但是验证两个数是否是质因数却可在多项式时间完成,所以它也是非确定性多项式问题,即NP问题。

之所以要定义NP问题,是因为通常只有NP问题才可能找到多项式的算法。我们不会指望一个连多项式地验证一个解都不行的问题存在一个解决它的多项式级的算法。

简单的说,存在多项式时间的算法的一类问题,称之为P类问题;而像梵塔问题,推销员旅行问题等问题,至今没有找到多项式时间算法解的一类问题,称之为NP问题。同时,P类问题是NP问题的一个子集。也就是说,能多项式时间地解决一个问题,必然能多项式时间地验证一个问题的解。

3.1NP与P的关系

目前,人类还未解决的问题是:是否所有的NP问题都是P类问题,即P=NP?。这就是注明的世界七大数学难题之首。虽然这个问题尚未解决,但是,一个总的趋势和大方向是人们普遍认为,P=NP不成立,也就是说,多数人相信,存在至少一个不可能有多项式级复杂度的算法的NP问题。

人们如此坚信P≠NP是有原因的,就是在研究NP问题的过程中找出了一类非常特殊的NP问题叫做NP-完全问题(Non-deterministic Polynomial Complete Problem),也即所谓的 NPC问题。正是NPC问题的存在,使人们相信P≠NP。

4.NPC问题

4.1约化

为了说明NPC问题,我们先引入一个概念——约化(Reducibility,有的资料上叫“归约”(Reduction)) 。

约化的概念: 
约化的标准概念:如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可约化为问题B,即可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。 如:一元一次方程可以“归约”为一元二次方程。

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

约化的意义: 
问题A可约化为问题B”有一个重要的直观意义:B的时间复杂度高于或者等于A的时间复杂度。也就是说,问题A不比问题B难。

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

4.2NPC问题

NPC问题是指满足下面两个条件的问题: 
(1)它是一个NP问题; 
(2)所有的NP问题都可以用多项式时间约化到它。

所以显然NP完全问题具有如下性质:它可以在多项式时间内求解,当且仅当所有的其他的NP完全问题也可以在多项式时间内求解。这样一来,只要我们找到一个NPC问题的多项式解,所有的NP问题都可以多项式时间内约化成这个NPC问题,再用多项式时间解决,这样NP就等于P了。

目前,NPC问题还没有找到一个多项式时间算法,因此我们就此可直观地理解,NPC问题目前没有多项式时间复杂度的有效算法,只能用指数级甚至阶乘级复杂度的搜索。

大多数人的观点对于 P类问题,NP类问题,NPC之间的关系可用下图表示(此图正确性有待验证):

这里写图片描述

4.3第一个NPC问题

逻辑电路问题是第一个NPC问题。逻辑电路问题指的是这样一个问题:给定一个逻辑电路,问是否存在一种输入使输出为True。

逻辑电路问题属于NPC问题。这是有严格证明的。它显然属于NP问题,并且可以直接证明所有的NP问题都可以约化到它(不要以为NP问题有无穷多个将给证明造成不可逾越的困难)。证明过程相当复杂,其大概意思是说任意一个NP问题的输入和输出都可以转换成逻辑电路的输入和输出(想想计算机内部也不过是一些0和1的运算),因此对于一个NP问题来说,问题转化成了求出满足结果为True的一个输入(即一个可行解)。

有了第一个NPC问题后,一大堆NPC问题就出现了,因为再证明一个新的NPC问题只需要将一个已知的NPC问题约化到它就行了。后来,Hamilton回路成了NPC问题,TSP问题(旅行商问题)也成了NPC问题。现在被证明是NPC问题的还有很多,任何一个NPC问题找到了多项式算法的话所有的NP问题都可以完美解决了。因此说,正是因为NPC问题的存在,P=NP变得难以置信。P=NP问题还有许多有趣的东西,有待大家自己进一步的挖掘。攀登这个信息学的巅峰是我们这一代的终极目标。现在我们需要做的,至少是不要把概念弄混淆了。

5.NPH问题

NPH问题(NP难问题,英文NP-hard问题),其满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比 NPC问题的范围广,但不一定是NP问题)。

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


参考文献

[1]http://blog.youkuaiyun.com/liufeng_king/article/details/8475508
[2]多项式时间算法
[3]NP(Non-Deterministic Polynomial, 非确定多项式) 
[4]什么是P问题、NP问题和NPC问题
[5]图论中P、NP、NPC和NP难问题详解.

### P问题NP问题的区别及关系 #### 一、基本概念 P问题是可以在多项式时间内由确定型图灵机解决的问题集合[^1]。这意味着对于一个问题实例,存在一个算法能够在输入规模 \(n\) 的某个多项式函数的时间内给出解答。 相比之下,NP问题是指那些解可以被验证在多项式时间内的问题集合[^2]。换句话说,如果给定某个候选解,我们可以快速确认这个解是否正确。然而,找到这样的解可能需要指数级的时间或其他更复杂的资源。 两者之间的主要区别在于解决问题所需时间验证解决方案所需时间的不同性质: - **求解时间**:P类中的任何成员都可以高效地(即,在合理的时间范围内)得到确切答案; - **验证时间**:而对于属于NP但未必也位于P里的那些案例,则重点放在如何迅速检验已提出的假设上而非自行构建它们的过程本身之上。 #### 二、包含关系 根据当前理解以及所展示出来的证据链路来看,存在着如下层次结构的关系表达形式[P ⊆ NP][^4]: \[ \text{P} \subseteq \text{NP} \] 这表明所有能有效率完成的任务必然也可以轻松加以核验;但是反过来却不一定成立——有些事情虽然难以实际操作出来,但如果有人告诉你具体做法的话还是很容易去判断其真伪性的。 另外值得注意的是还有更高阶别的复杂度类别比如EXPtime等等继续向外扩展着整个体系框架,并且理论上讲如果没有特别限制条件加诸其中的话上述提到过的各类别之间应该都是严格递增包含的状态。 #### 三、NP完全(NPC)与NP(NPH) 为了进一步探讨这两者间的联系,引入了两个重要子集的概念—NPC(Non-deterministic Polynomial-time Complete Problems 即所谓的“最难”的一类NP问题),只要任何一个此类题目找到了有效的通用方法来处理,就意味着整个NP领域都将迎刃而解; 而NPH则指即使不属于标准意义上的判定性任务范畴但仍具备至少同等于某些特定NPC难度水平特征的存在们[^3]. 综上所述,尽管至今为止尚未有确凿依据支持或者反驳\(P=NP\),但从现有研究成果出发推测二者很可能并不相等. ```python def is_p_problem(solvable_in_poly_time): """Check if a problem belongs to class P.""" return solvable_in_poly_time def is_np_problem(verifiable_in_poly_time): """Check if a problem belongs to class NP.""" return verifiable_in_poly_time # Example usage demonstrating the distinction between P and NP problems. example_input_size = 100 p_example_runtime = example_input_size**2 # A polynomial runtime function like O(n²). np_verification_runtime = example_input_size * math.log(example_input_size) # Logarithmic verification time. print(f"P Problem Runtime: {is_p_problem(p_example_runtime <= some_large_value)}") print(f"NP Verification Time: {is_np_problem(np_verification_runtime <= another_large_value)}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值