时间复杂度是用来评估算法性能的一个重要指标,有以下对应的关系。
1 < log(n) < n < nlog(n) < n^2 < n^3 < 2^n < n! < n^n
(1) 1 表示常数。
程序执行的最大次数是可以估计到的,也就是说是一个常数。
(2) log(n)
如果一个程序的运行时间是对数级的,则随着N的增大程序会渐渐慢下来,如果一个程序将一个大的问题分解成一系列更小的问题,每一步都将问题的规模缩减成几分之一,一般就会出现这样的运行时间函数。在我们所关心的范围内,可以认为运行时间小于一个大的常数。对数的基数会影响这个常数,但改变不会太大:当N=1000时,如果基数是10,logN等于3;如果基数是2,logN约等于10.当N=1 00 000,logN只是前值的两倍。当N时原来的两倍,logN只增长了一个常数因子:仅当从N增长到N平方时,logN才会增长到原来的两倍。
(3) n
线性时间复杂度,常用的一个循环,就是这样的复杂度。
(4) nlog(n)
如果某个算法将问题分解成更小的子问题,独立地解决各个子问题,最后将结果综合起来,运行时间一般就是NlogN。当N=1 000 000时,NlogN大约是20 000 00020 000 000。当N增长到原来的两倍,运行时间超过原来的两倍,但超过不是太多。
(5) n^2
常见的双层循环
(6) n^3
常见的三层循环
(7) 2^n
指数级的时间复杂度。
在排序算法中经常会比较n^2和nlog(n)的时间复杂度。在稍后的排序算法中,再详细分析。