【严格定义请参考相关教材性读物,此文尽量从通俗易懂入手】
1.基础概念:
-
P问题:多项式时间内可解的判定问题
-
NP问题:多项式时间内可验证(结果是0或者1)的问题
-
co-NP问题:NP的补问题
-
NPC问题:【NP-Complete】NP问题中最难的问题
-
NP-Hard问题:比所有NP问题还难的问题,但不要求一定是NP问题
2.关系分析:
-
所谓验证就是在提供一个证据的情况下,判断一个目标是否可以达到,相比起来:判定就要找到一组具体的变量来满足一定的目标条件,如达到最优解的一组变量值,而验证是提供了某一组变量的值,看是否满足目标条件。相对而言:
验证要比判定简单。举个简单的例子:验证就是给你一组数字,让你看它是否是某个方程组的解,而判定则要求你求出所有解。毫无疑问,验证是简单的。(这里只是举例说明,不考虑精确性,尽管在中文中,这两个词的意思是如此接近,这里的名词也仅是常用的词汇的翻译,谁让老外先研究我们再翻译呢)
-
Co-NP是NP的补问题,举例来讲,如果我们说某一个某一个NP问题是:是否满足条件的解,那么Co-NP就是是否不存在这样的解满足条件?那么Co-NP问题是NP问题么,不一定。
-
不要误解为NP就是P问题的反义(从字面上看),至少到目前为止,还没有人能证明P,NP,co-NP的绝对包含关系,我们的认知只是从一般感觉上出发【广告:谁要是能解决这个包含问题,图灵奖探囊取物】。当前研究者倾向于:
图上很清晰,我就不解释了。
-
NPC,俗称NP完全问题,是号称NP问题中最难的问题集合,据说目前已经找到1k多的NPC问题,它们都是最难的?yes,或者说是一样难的,只要你能证明其中一个是可以多项式时间内找到解的,那么你就证明了p=NP了。试想:最难的都是P的了,其它的就更不用说了。重复:图灵奖也是你的了。
-
常见的NPC问题有:
-
CIRCUIT-SAT 布尔组合电路:找到让电路可满足的布尔输入值指定
-
SAT 布尔逻辑:找到让布尔公式满足的值指定
-
2-CNF-SAT 三文字合取范式:找到让三文字合范式最后输出值满足的值指定
-
Clique 完全子图:在一个图中,找到最大的顶点集合,要求这几个顶点之间全连接
-
Vertex-cover 顶点覆盖:在一个图中,找到最小的顶点集合,要求这几个顶点所相连接的边覆盖全图
-
Ham-Cycle 哈密顿圈:要求寻找一条环游路线使得经过每个定点恰好一次
-
TSP 旅行商问题:如何找到在拜访每个地点一次后再回到起点的最短路径,也就是最优哈密顿圈问题
-
Subset-sum 子集和:找到一个子集,让其和满足一定条件
-
-
NP-hard不一定是NP问题,如果我们希望证明一个问题是NPC问题,往往先证明其是一个NP问题,然后是NP-hard问题,那么其就是一个NPC问题。