P类问题、NP类问题、NPC类问题、NP难问题

   在讨论算法的时候,常常会说到这个问题的求解是个P类问题、NP类问题、NPC类问题、NP难类问题。
   在讲P类问题之前先介绍两个概念:多项式,时间复杂度。
   多项式:ax^n^+bx^n-1^+c
   在计算机算法求解问题当中,经常用时间复杂度和空间复杂度来表示一个算法的运行效率。
   空间复杂度表示一个算法在计算过程当中要占用的内存空间大小。
   时间复杂度则表示这个算法运行得到想要的解所需的计算工作量,他探讨的是当输入值接近无穷时,算法所需工作量的变化快慢程度。
   时间复杂度排序:o(1)2,n表示输入的数据个数,o(1)为常数级别)

1)P类问题:存在多项式时间算法的问题。(P:polynominal,多项式)
以冒泡排序为例,在排序这个大问题里,是可以找到一种时间复杂度为多项式o(n2)的算法(如冒泡排序法)来求解排序问题的,所以我们说排序问题是一个有多项式时间算法的问题。
为什么我们要研究这个?因为计算机处理的输入数据达到100万个的时候,时间复杂度为o(n2)和o(en)的算法,所需的运行次数简直是天壤之别,o(en)指数级的可能运行好几天都没法完成任务,所以我们才要研究一个问题是否存在多项式时间算法。而我们也只在乎一个问题是否存在多项式算法,因为一个时间复杂度比多项式算法还要复杂的算法研究起来是没有任何实际意义的。

2)NP类问题:能在多项式时间内验证得出一个正确解的问题。(NP:Nondeterministic polynominal,非确定性多项式)
P类问题是NP问题的子集,因为存在多项式时间解法的问题,总能在多项式时间内验证他。
著名的NP类问题:旅行家推销问题(TSP)。即有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的环路,这个环路路径小于a。我们知道这个问题如果单纯的用枚举法来列举的话会有(n-1)! 种.已经不是多项式时间的算法了,(注:阶乘算法比多项式的复杂)。
但是,我们可以用猜的,假设猜几次就猜中了一条小于长度a的路径,问题解决了,皆大欢喜。可是,我不可能每次都猜的那么准,也许我要猜完所有种呢?所以我们说,这是一个NP类问题。也就是,我们能在多项式的时间内验证并得出问题的正确解,可是我们却不知道该问题是否存在一个多项式时间的算法,每次都能解决他(注意,这里是不知道,不是不存在)。
所以这就引出了这类讨论的一个千年问题:是否 NP类问题=P类问题?即,是否所有能在多项式时间内验证得出正确解的问题,都是具有多项式时间算法的问题呢?

2)NPC类:是NP的一个子集,且其中每一个问题均能由NP中的任何问题在多项式时间内转化成。
很多时候NPC问题是找不到一个多项式时间算法的,更多时候他是一个指数级的算法。
对于这一类问题,他们满足两个性质,一个就是在多项式时间内可以验证一个解是不是正确的解,另一个性质就是我们可以把任何一个NP问题在多项式的时间内把他的输入转化,使之成为一个NP-complete问题(即规约)。NP-Complete Problem问题在多项式时间内可以互相转换,只要其中一个问题可以在多项式时间内解决,那么其他问题也都将可以在多项式时间内解决。

3)NPH问题:若问题A不属于NP类,已知某一NPC问题可在多项式时间内转化为问题A,则称A为NPH。
NP-hard问题至少和NP问题一样难。

下面贴一张图把四者的关系捋一捋
P类问题、NP类问题、NPC类问题、NP难问题_第1张图片

你可能感兴趣的:(P类问题、NP类问题、NPC类问题、NP难问题)