什么是P问题,什么是NP问题,什么是NPC问题

参考:https://zhuanlan.zhihu.com/p/22497908  讲的真好!

一种时间复杂度是O(1),O(log(n)),O(n^a)等,我们把它叫做多项式级的复杂度

另一种是O(a^n)和O(n!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。

P问题

该问题能够找到一个算法,时间复杂度是o(1) o(n) o(nlogn)等 多项式时间 的级别 

NP问题 

就是可以短时间内(多项式时间内)验证一个答案正确性的问题。

(找一个解很困难,但验证一个解很容易。)

我们可能没有一个已知的快速的解决问题的方法,但是如果给我们一个候选的答案,我们能够在短时间内(polynominal多项式时间)验证这个candidate answer到底是不是我们已知问题的答案,这类问题叫做NP problem。

所以很显然 P Problem是NP problem的一个子集。

NPC问题

约化

求解 一元一次方程 -- >  求解二元一次方程

解决了B,A就能解决。 B问题比A问题复杂一点。

NPC的直观解释

存在这样一个NP问题,所有的NP问题都可以约化成它。

换句话说,只要解决了这个问题,那么所有的NP问题都解决了。 这个问题就是NPC问题

我们有理由相信,NPC问题是最复杂的问题。

人们想表达一个问题不存在多项式的高效算法时应该说它“属于NPC问题”。

NPC的定义

同时满足下面两个条件的问题就是NPC问题

  • 它是一个NP问题
  • 所有的NP问题都可以约化到它。

如何证明一个问题是NPC问题

  • 先证明它至少是一个NP问题
  • 再证明其中一个已知的NPC问题能约化到它(约化的传递性)

为什么人们坚信P≠NP

既然所有的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,NP也就等于P 了。因此,给NPC找一个多项式算法太不可思议了。“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。