在学习算法分析的过程中,我们首先需要明确的是p类、np类、npc类、np-hard类问题的定义以及它们的异同,其实对于很多人都没有搞清楚它们的定义,甚至混淆它们的用法。
1.P类问题,可以这样记:Polynomial time solve,可以在确定性图灵机计算模型上以多项式时间解决的问题类,叫做P类问题。
2.NP类问题,NonDeterministic Polynomial time verify,在非确定图灵机计算模型上能以多项式时间验证的问题类,叫做NP类问题。
补充:对于P类问题,既然我们能在多项式时间内解决,那么我们就一定能在多项式时间内验证,“easy” to be solved(easy to be verified),这里的easy指的是在多项式时间内,因此我们很容易知道P类问题是NP类问题的子集。
3.NPC问题,“hard” to be solved but easy to be verified,难以在多项式时间内求解但是可以在多项式时间内验证的问题,是NPC问题,即我们无法"容易"的找到一个答案,但是当给我们一个答案时,我们可以“容易”的验证这个答案是否正确。就是因为NPC问题的存在,所以我们不知道P问题是否等于NP问题,NPC问题属于NP中比较难的问题。
注意:对于NPC类问题,我们的输出只能是Yes或No,即NPC问题都是判定类问题,而不是构造性问题,这点需要明确。
举例一:例如在TSP问题中,如果让我们找到一条哈密顿回路让其代价最小,这属于构造类问题,不属于NPC问题,属于NP-hard问题。
NPC问题:在TSP问题中,是否存在一条哈