2.2 函数渐近增长(用来推理大O表示法)
概念:
给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是 比 g(n)大,那么我们说 f(n) 的增长渐近快于g(n)。(f比g效率要低)
测试①:
假设四个算啊的输入规模都是n:
- 算法A1 要做 2n +3 次操作,可以这么理解:先执行 n 次的循环,执行完毕后,再有一个n次循环,最后有三次运算。
- 算法A2 要做 2n 次操作
- 算法B1 要做 3n + 1 次的操作,可以这个理解:先执行 n 次循环,再执行一个 n 次的循环,最后有一个 1 次的运算。
- 算法B2 要做 3n次 的操作
那么上述的算法,哪个更快一些呢?
输入规模 | 算法A1 | 算法A2 | 算法B1 | 算法B2 |
---|---|---|---|---|
n = 1 | 5 | 2 | 4 | 3 |
n = 2 | 7 | 4 | 7 | 6 |
n = 3 | 9 | 6 | 10 | 9 |
n = 10 | 23 | 20 | 31 | 30 |
n = 100 | 203 | 200 | 301 | 300 |
从上述表格可以观察出下面的图示:
通过数据表格,比较算法A1和算法B1:
- 当输入规模n=1时,A1需要执行5次,B1需要执行4次,所以A1的效率比B1的效率低。
- 当输入规模n=2时,A1需要执行7次,B1需要执行7次,所以A1的效率和B1的效率一样。
- 当输入规模n>2时,A1需要的执行次数一直比B1需要执行的次数少,所以A1的效率比B1的效率高。
所以我们可以得出结论:
当输入规模 n > 2 时,算法A1的渐近增长小于算法B1的渐近增长
但是!!通过观察折线图,我们发现,随着输入规模的增大,算法A1和算法A2逐渐重叠到一块儿了,算法B1和算法B2逐渐也重叠在一起,所以我们得出结论。
随着输入规模的增大,算法的常数操作是可以忽略不计的!
测试②:
假设四个算法的输入规模都是n:
- 算法C1需要做 4n + 8 次操作
- 算法C2需要做 n 次操作
- 算法D1需要做 2n
2
次操作- 算法D2需要做 n
2
次操作
那么上述算法,哪个更快一些?
输入规模 | 算法C1 | 算法C2 | 算法D1 | 算法D2 |
---|---|---|---|---|
n = 1 | 12 | 1 | 3 | 1 |
n = 2 | 16 | 2 | 9 | 4 |
n = 3 | 20 | 3 | 19 | 9 |
n = 10 | 48 | 10 | 201 | 100 |
n = 100 | 408 | 100 | 20001 | 10000 |
n = 1000 | 4080 | 1000 | 2000001 | 1000000 |
从上述表格可以观察出下面的图示:
这个 图 其实 取值 是段落的,所以看不出来。其实 C1和C2的曲线 在 n 逐渐变大的时候 已经 趋于 重合了,包括 D1 和 D2。
通过数据表格,比较算法C1和算法D1:
- 当输入规模 n <= 3 时,算法C1执行次数多于 算法 D1,因此算法 C1 效率低一些;
- 当输入规模 n > 3 时,算法C1执行次数少于 算法 D1,因此,算法 D2 效率低一些;
- 所以总体上来说,算法 C1 优于 算法 D1 的。
通过折线图,对比对比算法C1和算法C2:
- 随着输入规模的增大,算法C1和算法C2几乎重叠
通过折线图,对比算法 C系列和算法D系列:
随着输入规模的增大,即使去除 n
2
前面的常数因子,D系列 的次数也是要 远远高于 C系列的。
-
随着输入规模的增大,与最高次项相乘的常数可以忽略!
测试③:
假设四个算法的输入规模都是n:
- 算法E1:2n
2
+3n+1- 算法E2:n
2
- 算法F1:2n^3+3n+1
- 算法F2:n
3
那么上述算法,哪个更快一些?
输入规模 | 算法E1 | 算法E2 | 算法F1 | 算法F2 |
---|---|---|---|---|
n = 1 | 6 | 1 | 6 | 1 |
n = 2 | 15 | 4 | 23 | 8 |
n = 3 | 28 | 9 | 64 | 27 |
n = 10 | 231 | 100 | 2031 | 1000 |
n = 100 | 20301 | 10000 | 2000301 | 1000000 |
从上述表格可以观察出下面的图示:
通过数据表格,对比算法E1和算法F1:
当 n = 1时,算法E1 和 算法 F1 的执行次数一样;
当 n > 1时,算法E1的执行次数云云小于算法F1的执行次数;
所以算法E1总体上是由于算法F1的。
通过折线图我们会看到,算法 F 系列 随着 n 的 增长 会变得特快,算法 E 系列随着 n 的增长 相比较算法 F 来说,变得 比较慢,所以 可以得出结论:
最高次项的指数大的,随着 n 的增长,结果也会变得增长特别快。
测试④:
假设五个算法的输入规模都是 n :
- 算法G:n
3
- 算法H:n
2
- 算法I:n
- 算法J:log
n
- 算法K:1
那么上述算法,哪个更快一些?
输入规模 | 算法G | 算法H | 算法I | 算法J | 算法K |
---|---|---|---|---|---|
n = 2 | 8 | 4 | 2 | 1 | 1 |
n = 4 | 64 | 16 | 4 | 2 | 2 |
从上述表格可以观察出下面的图示:
通过观察数据表格和折线图,很容易可以的得出结论:
算法函数中 n 最高次幂越小,算法效率越高
综上所述,在我们比较算法随着输入规模的增长量时,可以有以下规则:
1.** 算法函数中的常数可以忽略;**
2.
算法函数中最高次幂的常数银子可以忽略;
3.** 算法函数中最高次幂越小,算法效率越高;**