目录
2.NP问题 (Nondeterministic Polynomial Time)
P、NP、NPC与NPH 问题简介
计算机科学领域中,算法复杂度理论是理解计算问题难易程度的关键。其中,P、NP、NPC与NPH这四个概念尤为重要,它们不仅帮助我们分类问题的难度,还指引着算法设计的方向。本文将简要介绍这些概念的基本定义及其相互之间的关系。
一、总述
- 总的概念
-
P问题: Polynomial Time Problem, 能在多项式时间内解决的问题;
-
NP问题: Non-deterministic Polynomial Time Problem, 不能在多项式时间内解决或不确定能不能在多项式时间内解决,但是能在多项式时间内验证一个解的问题;
-
NPC问题: NP Complete Problem, 也称NP完全问题,所有NP问题在多项式时间内都能约化(Reducibility)到它,并且它本身就是一个NP问题的问题。换句话说,如果解决了此NPC问题,那么所有的NP问题也都能得到解决;
-
NPH问题: NP Hard Problem, 也称NP难问题,所有NP问题在多项式时间内都能约化(Reducibility)到它的问题,但它本身不一定是NP问题。
- 总的关系
引自浅谈 | P问题、NP问题、NPC问题、NP-Hard问题
(1)P问题和NP问题是否相等 ,即能用多项式时间验证解的问题是否能在多项式时间内找出解,至今还没有人能够解决 P 是否 = NP 的问题,该问题被美国“克雷数学研究所”(Clay Mathematics Institute)收录在千禧年大奖难题中,堪称世界七大数学难题之一。
(2)NPC问题是NP问题和NP-Hard问题的交集,我们可以把NPC问题看成是NP问题中很难很难的问题。
- 总的意义
我们为什么要对实际问题进行分类和区分呢?
一个最大最直观的好处就是,当我们对一个待解决的问题有了自己的判断(是P问题?NP问题?还是NPC问题?),我们就可以建立自己的解决网络,
比如说,如果我们判断一个问题是P问题,把么是可以在多项式时间找到解的,但是,如果一个问题是NPH问题,我们并不一定能够找到最优解,有时候持有次优解即可(其实既然是工程问题,我们与其钻牛角尖寻求最优解,不如用小得多的代价寻求次优解)。
如果一个问题连NP问题都不是,也就是说我在多项式时间内连验证它都很费劲,又谈何解决出来呢?这类问题就不大有研究的必要了。
二、分述
1. P问题 (Polynomial Time)
P类问题指的是能够在多项式时间内 解决 的问题。
这里的“多项式时间”意味着存在一个多项式函数 ,对于任何输入规模
,算法的运行时间都不会超过
。
简单来说,如果一个问题可以用一个高效的算法来解决,并且这个算法的时间复杂度是输入数据大小的某个多项式函数,那么这个问题就属于P类。
例如,查找数组中的最大值、排序、计算1-1000的连续整数之和 等问题都可以通过多项式时间的算法解决。
2.NP问题 (Nondeterministic Polynomial Time)
NP类问题是指那些在多项式时间内可以 被验证 的问题,但是不能被解决,或者不确定是否能解决。
也就是说,如果我们有一个解,我们可以快速地(即多项式时间内)验证它是否正确。需要注意的是,NP并不意味着“非多项式”,而是“非确定性多项式时间”的简称。
举个例子,考虑 旅行商问题(TSP),给定一组城市间的距离,我们需要找到一条访问每个城市恰好一次并返回出发城市的最短路径。虽然我们目前不知道如何在多项式时间内找到这样的路径,但如果有人给我们一个可能的解决方案,我们可以在多项式时间内验证这条路径是否是最短的。
又例如,计算地球上所有原子个数之和:这个问题就很困难甚至无解,但是现在有个答案是300个,显然是错的,所以很容易验证但不容易求解,这种算NP类问题。
又例如,数独游戏:数独游戏的目标是用数字填充9x9的宫格,让每一行,每一列和每个3x3小九宫部分都包含1到9之间的所有数字。
判断一个填写方案是否正确非常容易。你只要观察每一行,每一列和每一个单元格,以确定是否满足要求就可以了。但从头找到一个解决方案可能需要更长的时间。直到今天,我们所知道的解决数独游戏的最佳方法,基本上就是系统地尝试所有可能性。因此,我们可以说“找到问题的解决方案比检查一个方案是否正确更难”。
3. NPC问题 (NP-Complete)
NP-Complete(NPC)问题是NP问题的一个子集。
这类问题具有两个重要特征:
一 是它们本身属于NP;
二 是所有NP问题都可以在多项式时间内归约为任何一个NPC问题。
换句话说,如果能够找到一个有效的多项式时间算法解决任意一个NPC问题,那么所有的NP问题都能在多项式时间内得到解决。
这里提到了可规约的概念:
就是将一个问题转化为另一个问题,使的用第二个问题的解来解第一个问题第一个问题。
这种思想类似于数学证明中,如果一个证明很难从原命题切入,此时根据原命题与其逆否命题是等价的,将原命题转换成逆否命题求解,将得到及其简便的解法或者是结题的切入点。
例如,假设要在一个城市中认路,如果有一张地图,就将认路问题归约得到地图问题。
同时约化还具有一个重要性质:约化具有传递性。也就是说如果问题A可约化为问题B,问题B可约化为问题C,那么问题A一定可约化为问题C。
一个经典的NPC问题是哈密顿回路问题,即在一个无向图中是否存在一条经过每个顶点恰好一次的回路。
4. NPH问题 (NP-Hard)
NP-Hard(NPH)问题是指至少和所有NP问题一样难的问题,但不一定属于NP。
这意味着所有NP问题都可以在多项式时间内归约到NPH问题上,但NPH问题的解可能无法在多项式时间内验证。NPH问题包括了所有NPC问题以及一些更难的问题。
例如,一般化的旅行商问题(其中距离可以是任意正实数)就是一个NPH问题。
笔者将在另外一篇文章详细介绍旅行商问题,文章链接:
三、结论
P、NP、NPC和NPH问题构成了计算机科学复杂度理论的基础。尽管我们已经知道很多问题属于NP,但我们还不知道P是否等于NP。这是一个尚未解决的重大开放问题,它对理论计算机科学乃至整个科学领域都有深远的影响。如果能证明P=NP,那么许多被认为难以解决的实际问题都将变得易于处理。
---
希望这篇简短的文章能帮助您了解这些基本概念。如果您需要进一步的信息或者有特定的问题想要探讨,请随时告诉我!