Algorithm - P、NP、NPC和NP-Hard问题
先用几句话简单说明一下时间复杂度。**时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序运行需要的时间增长得有多快。**也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。不管数据有多大,程序处理花的时间始终是一样的,我们就说这个程序很好,具有 $O(1)$ 的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是 $O(n)$,比如找 $n$ 个数中的最大值;而像冒泡排序、插入排序等,数据扩大 $2$ 倍,时间变慢 $4$ 倍的,属于 $O(n^2)$ 的复杂度。还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是 $O(a^n)$ 的指数级复杂度,甚至 $O(n!)$ 的阶乘级复杂度。不会存在 $O(2n^2)$ 的复杂度,因为前面的那个 $2$ 是系数,根本不会影响到整个程序的时间增长。同样地,$O (n^3+n^2)$ 的复杂度也就是 $O(n^3)$ 的复杂度。因此,我们会说,一个 $O(0.01n^3)$ 的程序的效率比 $O(100n^2)$ 的效率低,尽管在 $n$ 很小的时候,前者优于后者,但后者运行所需的时间随数据规模增长得慢,最终 $O(n^3)$ 的复杂度将远远超过 $O(n^2)$。我们也说,$O(n^{100})$ 的复杂度小于 $O(1.01^n)$ 的复杂度。 ...