时间复杂度是算法的特性,而不是问题的特性。因为一个问题可以用两种以上的算法进行解答,且各自的时间复杂度也不相同。计算机理论科学的计算复杂度理论就是属于这一类的学科。
- P 指的是用计算机能很快求解的问题;
- NP 指的是我们想找到最优解的问题;
1. 问题的特性
计算复杂度理论研究的是问题的特性
计算复杂度理论是学习各类问题特性的一门学科,先来比较如下两个问题:
- 排序问题:对给定的 N 个整数进行排序,答案是什么?
- 子集和(subset sum)的问题:
N 个数中挑选几个数,能否使其和为 S ?
能否直接判断两个问题孰难孰易?此处的“难”并不是指解题的难度(对人而言,而是对计算机而言)。计算复杂性理论中,问题的难度指的是当前问题是存在快速解题算法。
通常认为,有快速解题算法的问题计算起来比较容易,反之,计算起来比较难。
快速算法的标准是什么呢?一般把多项式时间算法或比它更快的算法称为“快速算法”。(快速其实是定量的,不只是简单地你说它比其他的快,它就快,最后都要落实到计算机的执行)。
计算复杂度理论中存在着多项式时间算法的问题合称为“P 问题”(Polynomial)。
例如,排序问题有无数个多项式算法,因此排序问题是 P 问题。像 P 问题 这种把具有相同特性的问题聚集到一起的集合就是“计算复杂度类(complexity class)”
计算复杂度类:
- P 问题(Polynomial Problem),已找到多项式时间的快速算法的问题构成的集合;
nO(1)
- NP 问题(Non-Polynomial ),NP 问题是可在多项式时间内验证已确定答案的问题。;
- 问题的解可在多项式时间内得以验证(checked)的问题构成的集合;
- 所有 P 问题都包含于 NP 问题的集合
证明一个问题能在多项式时间内完成比较容易,但不能解是十分困难的。就像经常谈论的 UFO,要证明它的存在,只需获取一架 UFO 即可,但要证明它的不存在,最笨的方法自然是遍历整个宇宙空间。
比如子集和(subset sum)的问题,目前尚未发现解出子集和的多项式时间算法,但也不能证明这种算法就不存在。
2. 所谓难度
计算复杂度理论使用规约(reduction)方法比较两个问题的难度。约简是把一个问题转换成另一个问题进行解答的方法。假如有一个约简算法能把 B 的输入值适当地变换成 A 的输入值,那么利用解 A 题的最快算法和约简算法就能编写解 B 更难的问题。