P, NP, NP-Hard, NPC问题

时间复杂度是设计程序时十分重要的一个指标
时间复杂度的优劣很大程度上决定了程序的运行时间长短
为了对各种问题进行研究,我们将问题的时间复杂度分为几类
分别为P类,NP类与其它

0.多项式时间复杂度

多项式时间复杂度是指这个算法的时间复杂度小于等于一个与数据规模有关的多项式
简单地说,就是形如O(nk lognp)O(n^k~\log n^p)的时间复杂度
其中k为常数,nn为数据规模

0.5.这篇文章的精髓

总的来说这篇文章讲的东西就是下面这张图:
P, NP, NP-Hard, NPC问题
(请忽略水印)
好了水访问量的目的已经达到了
这篇文章再看下去只会浪费您的时间

1.P类问题

定义

可以在多项式时间内解决的问题

例子

绝大多数的算法问题
比如
比较型数组排序——O(nlogn)O(n\log n)
A+B——O(1)O(1)
最长公共子序列(暴力DP)——O(n2)O(n^2)
等等

2.NP类问题

定义

可以在多项式时间复杂度内验证结果正确性的问题

例子

所有的NP类问题
求图中的哈密顿路径
旅行商问题

与P类的关系

P类问题都是NP类问题
但是NP类问题是否等价于P类问题还真不好说
解决"P=NP"是否正确是千禧年七大难题之一——然而还没有人证明或证伪

3.NP-Hard问题

定义

所有NP问题都可以在多项式时间复杂度内转化到的问题,本身不一定是NP问题

这玩意儿我不是很理解
怎么能证明到所有的NP问题都可以转化呢???
但是只要记一下定义就可以了

4.NPC问题

定义

既是NP问题,又是NP-Hard问题的问题

与NP-Hard、NP的关系

NP-Hard和NP的交集