P、NP、NP-hard、NP-complete问题是一个比较难理解的问题,实际上他们的本质只是根据问题的复杂程度进行分类。
P问题
通过一个多项式公式,使用一个图灵机计算这个公式的答案就能解决的问题。比如说判断一个数是否是偶数,只需要对它取余数判断是否为0即可。
通常解决问题的时间跟公式的复杂程度有关,称为多项式时间
。一般来说,这种问题我们称为简单的,可以通过计算公式答案直接解决的。但是这个问题一定是简单到可解决的吗?不一定,要是公式非常复杂,以现在已有的图灵机根本算不出来,这也是没啥意义的。比如galactic algorithm
。
但是实用性和理论研究上确实有不同,理论研究只是讲模型,算不出来我不管,如果这个问题能用公式总结,我就称为P问题,不管这个公式的复杂程度。
NP问题
那么很多问题是无法直接通过套公式直接计算出来的,那么就需要一直“猜”来获取正确结果值。只要是猜中了,那么立刻返回这个结果值就行。这个过程我们可以理解为某种算法,通过不停的if(相当于猜结果)来获取最后的结果。这类问题称为NP问题。
NP-hard问题
首先需要说明什么叫归约
,这有点类似函数当中的映射。如果解决了A问题,那么就可以解决B问题,我们称为A归约
为B,他们之间有一种映射关系
。那么如果有一个问题L,通过解决一个NP问题T之后,再通过多项式时间把T归约到L,那么问题L称为NP-hard问题。
NP-complete问题
如果问题L是NP-hard问题,同时还是NP问题,那么问题L被称为NP-complete问题。
迄今为止,这类问题中没有一个找到有效算法。倾向于接受NP完全问题(NP-Complete或NPC)和NP难题(NP-Hard或NPH)不存在有效算法这一猜想,认为这类问题的大型实例不能用精确算法
求解,必须寻求这类问题的有效的近似算法。
证明一个问题是NP-complete
- 证明这个问题是NP问题
- 使用一个已经被证明的NPC问题规约成当前问题