update big O notation

This commit is contained in:
Shine wOng
2019-05-07 16:18:21 +08:00
parent 1e40ed076d
commit 46704e8864

View File

@@ -99,3 +99,27 @@ $$ T_A(n) = the\ cost\ of\ algorithm\ to\ solve\ instances\ of\ scale\ n $$
$$T(n) = number\ of\ basic\ operations\ to\ solve\ a\ problem\ of\ scale\ n$$
### big O notation
前面说到通过建立的理想模型,我们可以把算法运行的时间,转化成在理想模型上运行的基本操作的次数。从而我们已经可以对不同的算法进行比较。这样的比较绝对是严谨的,只是在操作上还存在一些问题。
容易设想到不同的算法针对不同规模输入的数据其表现也不会相同。一些算法在小规模输入时表现良好另一些则恰恰相反在大规模输入时表现突出。这对应与两个算法的T(n)并不是严格的大于或者小于关系,而是一个此消彼长的过程。这种情况对于我们比较算法的优劣是不利的,因此有必要采取一些别的措施。
在评价算法的效率时,其实对于小规模的问题,我们往往不太关心它的效率,这是因为此时不同的算法的差异并不明显。因此,我们往往更关注于更大规模问题的效率。这种着眼长远,更注重时间复杂度的总体变化趋势的分析方法,即渐进分析(asymptotic analysis)。
存在不同的渐进分析方法。回忆我们之间提到我们往往是评价一个算法在最坏情况下的效率这里引入大O记号(big O notation),其定义如下:
```
若存在函数f(n)和正的常数c使得在渐进的条件(n >> 2)下T(n) <= c·f(n)则可以认为f(n)给出了T(n)增长速度的一个上界(最坏情况)记T(n) = O(f(n))
```
同时根据定义可以给出大O记号的几个性质:
+ 对于任意常数 c > 0, O(f(n)) = O(c·f(n))
+ 对于任意常数 a > b > 0, O(n^a + n^b) = O(n^a)
要注意的是性质2表面上是忽略了多项式中的低次项本质上是在大O记号的基础上进行了放大然后忽略掉常数项
$$n^a + n^b <= n^a + n^a = 2 * n^a = O(n^a)$$
在计算大O记号时可以直接忽略低次项的原因也在于此。