时间复杂度的表示意义:程序解决问题需要的时间随问题规模增大的增长率。
时间复杂度
时间复杂度并不表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
时间复杂度被分为两种级别,后者的复杂度无论如何都大于前者:
- O(1),O(log n),O(na)等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置。
- O(an)和O(n!)型复杂度,是非多项式级的,其复杂度计算机往往不能承受。
P类问题
如果一个问题可以找到一个能在多项式的时间里解决它的算法,这问题就属于P问题。
NP问题
NP问题不是非P类问题。
NP问题是指可以在多项式的时间里验证一个解的问题,或者在多项式的时间里猜出一个解的问题。
在此类问题中,找一个解很困难,但验证一个解很容易。
Hamilton问题是NP问题,因为验证一条路是否经过每个顶点非常容易。
当然也有不是NP问题的问题,猜到了解但是无法在多项式的时间里验证。如试问一个图中是否不存在Hamiton回路。
之所以定义NP问题,是因为通常只有NP问题才能找到多项式的算法,不可能指望一个连多项式地验证一个解都不行的问题存在一个解决它的多项式问题。
显然所有的P问题都是NP问题:能多项式地解决一个问题,必然能多项式地验证一个问题的解。
约化
一个问题A可以约化为问题B的含义是:可以用问题B的解法解决问题A,也就是说问题A可以变成问题B。
问题A可以约化为问题B的重要直观意义是:B的时间复杂度必须高于或等于A的时间复杂度,问题A不能B问题B难。
NPC问题
- 是一个NP问题。
- 所有NP问题都可以约化到它。
证明一个问题是NPC问题
- 首先证明它是NP问题。
- 其中一个已知的NPC问题能约化到它。
Hamilton回路成了NPC问题,TSP问题也成了NPC问题。