一.想要预估算法的运行时间,可以先计算测试样例的时间;然后将测试样例翻倍,记录时间;然后再翻倍……得到如下模型:
样例(N) | 运行时间(T(N)) |
---|---|
N | x1 |
2N | x2 |
4N | x3 |
8N | x4 |
16N | ? |
做图像x轴为lgN,y轴为lg(T(N))。我们一般可以得到一个斜率为b的直线。
lg(T(N)) = blgN + c
同时取2的幂,就可以得到 T(N) = aN^b (a = 2 ^ c)
二.我们想要知道算法内部具体发生了什么,导致了这样的运行时间。
我们可以知道,每条单独的指令,例如a > b ,的运行时间。那么程序的运行时间 = sum(指令时间i * 指令频率i)。
如果这样计算的话,我们需要着眼很多的细节。实际上我们可以不用专注于所有细节。我们可以只考虑,频率最多开销最大的基本操作,来估算作为整个程序的运行时间。一般我们认为,实际的运行时间就是常数乘以这个操作的运行时间;而这个操作的运行时间又是其频率的整数倍;因此实际的运行时间就是常数乘以这个操作的频率。
由以上可知,算法频率可以用来预估算法的性能,也就是所说的时间复杂度。算法频率为N^2 + N + 16时, N 和16可以忽略。这是因为当N趋于无穷时,(N ^ 2 + N + 16 ) /(N ^ 2)的极限为1。可以用N ^ 2 + N + 16 ~ N ^ 2来表示。