通俗理解NP,NPC,NP-Hard问题

通俗解释NP,NPC,NP-Hard问题

我们把解决一类问题的方法或过程,称之为算法。而算法有一个很重要的指标就是时间复杂度O。因为我们最终是要通过计算机来执行这些算法的,而计算机的算力再高也终究是个有限值,因此如果一个算法的时间复杂度很高,那么当输入的数据量十分庞大时,计算机处理的时间就会无法想象地增长。通过时间复杂度的概念就可以引出NP,NPC等问题。
有这样一类问题,求解它们所需的时间复杂度是多项式时间复杂度,也就是 O ( n C ) O(n^C) O(nC), C C C是一个常数。这种就是P类问题(p是polynomial的首字母),计算机能够容忍多项式时间复杂度的算法,即使夸张点来说, C = 10000000000 C=10000000000 C=10000000000,计算机也是能够接受的。随之要提到的就是NP问题。首先需要明确字母N不是Not的首字母,NP全称是Non-deterministic Problem。也就是说,NP问题并不是肯定没有多项式时间的解法,只是 可能 没有。NP问题指的是 能在多项式时间内验证一个解的一类问题。注意求解和验证是不同的。那么用来验证的这个解,是怎么得到的?猜出来的。因为NP问题不一定有多项式时间的解法能求出一个解。比如有这样一个问题“对于TSP问题,找到一条路径长度总和小于100的路径”,那我们就可以随便猜一条路径,再把这n条路径长度加起来 O ( n ) O(n) O(n),看是不是小于100就行了。如果小于100,那这条路径就是一个问题的解,虽然这个解是猜出来的。那么P问题一定是NP问题, P ∈ N P P\in NP PNP.因为P问题能在多项式时间内得到解决,那必然能在多项式时间内验证一个猜出来的解。
之后就简单了解一下NPC问题的概念。NPC问题首先是一个NP问题,也就是该类问题也能在多项式时间内验证一个解的正确性。所以NPC问题并不是想当然的认为“NPC比NP更难,所以NPC问题就是不能在多项式时间验证一个解的问题”。NPC问题和NP问题一样,也是可能存在一个多项式时间的解法。NPC中的C是complete的首字母,它的含义是 所有的NP问题都能够约化为一个NPC问题。那么NPC问题存不存在呢?存在! 但关键的是,NPC问题是存在的,即所有的NP问题都能约化为NPC问题,但目前人们并没有找到一个多项式时间复杂度的解法来解决NPC问题。所以暂时可以说NPC问题是无法求解的。所以,能解决NPC问题是一件非常非常非常非常厉害的事情。
NP-Hard的问题则更广。NP-Hard不一定是NP问题,也就是它可能连在多项式时间内验证一个解都做不到。所以可以把NP-Hard理解为比NPC更难的问题,也就是求解NP-Hard问题比求解NPC问题更离谱!
(如有错误,我道歉。。)

你可能感兴趣的:(算法,NP,NP-Hard)