P问题,指能在多项式时间内求解的问题。
凡是能用算法在有限时间内对问题求解的都算P问题,也都能用时间复杂度表示。
NP问题,非确定性多项式,能在多项式时间内验证解正确性的问题。
NP问题不一定能够用算法求解,即不能通过算法得到问题的答案或者确定问题没有答案,但可以在有限时间内去验证一个解是否正确,如果可能解是有限个的,那么我们还是可以在多项式时间内通过枚举等方式得到解。
比如哈密尔顿回路问题:在任一给定的图中,能不能找到这样的路径,即从一点出发不重复地走过所有的结点(不必通过图中每一条边),最后又回到原出发点。
我们好像没办法直接求解,但是对于任意一条路径,我们可以去验证它是否满足要求。
那么我们直接暴力枚举,对每一次答案去验证是否正确,那么最后我们就能得到哪条路径满足要求,或者没有路径满足要求。
一般我们认为NP包含P,因为能得到解的问题,也能对每个解去验证,但是P是否等于NP,还无法确定。
这两个问题很好理解了,但是NPC与NP-hard就不太容易理解了。
先看定义:
所有的NP问题都可以归约到一个问题,这个问题就被称为NP-hard问题。
如果这个NP-hard问题属于NP问题,那么它就是NPC问题。
NPC问题是NP问题和NP-hard问题的交集。
问题A归约到问题B,可以理解为问题B比问题A难多了,只要B都能解决,那么A也能解决。
通俗一点讲,NP-hard问题是不能在没有验证完所有可能解的情况下得到解或者无解的结论的。它必须验证完所有的可能解才有可能确定。可是可能解或许并不能完全验证,即便完全验证也没法得到结论。
如果我们最后能够得到结论,也就是属于NP问题了,这就是NPC问题。
相反,如果我们最后不能得到结论,那么它就不属于NP问题,这也是NP-hard问题中与NP问题无交集的部分。
假设有NP-hard问题 为问题A,所有的NP都能归约到问题A上。
由于所有NP问题都能够归约到问题A上,所以当这个问题A解决了,那么所有的NP问题也就解决了。
这就是NPC问题。
在NP问题里,我只能一个一个去猜测解,去验证是否正确从而得到解,但是如果我们验证完所有的有限可能解才能确定,在最后一个可能的解被验证时,我们也能得到这个问题是否有解了。
我们改变一下上面的哈密尔顿问题,把图中的每个点与点之间规定上距离,那么我们要求得到在所有能满足要求(回到起始结点,且经过所有结点的)的路径中经过距离最短的路径,这就是一个旅行推销员问题。
由于我们要得到一个最短距离的路径,不把所有路径走完,是没法确定后面没走的路径是否更短,这种情况就是NPC问题了。
NPC问题现在没有得到有效解法,因此许多人认为NPC与P至少不是同类,P与NPC又都属于NP,所以P是不等于NP的,不过还不能证明。
可是还存在问题A解决不了的情况。比如停机问题,任意一个程序是否会在有限时间内停止的问题。
只有两个可能解,会停止,不会停止。
如果程序B包含了程序A,令A停止时,B继续运行,A继续运行时,B停止程序。这样A无论停止与否,都会和B得到相反结论。
但无论是停止还是不会停止都会发现矛盾,因而解都是错误的,所以这个问题没法解决。
所以NP-hard问题中还包括一部分非NP问题。
NP包含P,NP包含NPC,NP-hard与NP交NPC。
以上仅是个人理解。