P问题是具有
多项式算法的判定问题。这里的P代表Polynomial。P问题就是可以有一个确定型图灵机在多项式时间内解决的问题。即那些存在O(n), O(nk), O(nlogn)等多项式
时间复杂度解法的问题。比如排序问题、
最小生成树、单源最短路径。直观的讲,我们将P问题视为可以较快解决的问题。
P问题(P-problem)具有
多项式算法的判定问题。这里P表示Polynomial一词的第一个字母。这类问题的吸引力在于:
NP问题是指那些可以在
非确定型图灵机上在多项式时间内解决的问题。(在确定型
图灵机上可以在多项式时间内验证解是否正确,但不能在多项式时间内找出
最优解的问题)。非确定型图灵机可以理解为无限个确定型图灵机的集合。应该是说的一种强大的还不存在的,也与计算机无法比较的一种计算机吧。也许它具备跳跃思维、能联想能学习能推理。
NP是还未找到
多项式解法的问题。对于这些问题,我们也不知道是否存在多项式的解法。所以叫非确定多项式问题。NP代表“Non-deterministic(非确定性)Polynomial(多项式)”而不是代表“Non-Polynomial(非多项式)。典型的NP问题是旅行商问题(TSP)。
之所以要定义
NP问题,是因为通常只有NP问题才可能找到多项式的算法。NP问题如果找到了多项式解法就是P问题了。NP问题是我们还未找到多项式解法的问题。我们也不能证明它一定存在或不存在多项式解法。调查显示有的人持肯定态度,认为NP问题一定存在多项式解法,即P=NP。有的坚信NP问题不存在多项式解法。当然也有的人持不确定态度。
人们想知道,是否所有的NP问题都是P类问题。所有对NP问题的研究都集中在一个问题上,即究竟是否有P=NP?这个问题还“啃不动”。但是,一个总的趋势、一个大方向是有的。人们普遍认为,P=NP不成立,也就是说,多数人相信,存在至少一个不可能有多项式级复杂度的算法的NP问题。
人们如此坚信P≠NP是有原因的,就是在研究NP问题的过程中找出了一类非常特殊的NP问题叫做NP-完全问题,也即所谓的
NPC问题。C是英文单词“完全”的第一个字母。正是NPC问题的存在,使人们相信P≠NP。为了说明NPC问题,我们先引入一个概念——约化(Reducibility,有的资料上叫“归约”)。
一个问题A可以约化为问题B的含义即是,可以用问题B的
解法解决问题A,或者说,问题A可以“变成”问题B。“问题A可约化为问题B”有一个重要的直观意义:B的时间复杂度高于或者等于A的时间复杂度。也就是说,问题A不比问题B难。这很容易理解。既然问题A能用问题B来解决,倘若B的时间复杂度比A的
时间复杂度还低了,那A的算法就可以改进为B的算法,两者的时间复杂度还是相同。
NPC问题的定义非常简单。同时满足下面两个条件的问题就是NPC问题。
先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它(由约化的传递性,则NPC问题定义的第二条也得以满足;至于第一个NPC问题是怎么来的,下文将介绍),这样就可以说它是NPC问题了。
既然所有的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,NP也就等于P了。因此前文才说,“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,NPC问题没有多项式的有效算法,只能用
指数级甚至阶乘级复杂度的搜索。