update big O notation
This commit is contained in:
@@ -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记号时,可以直接忽略低次项的原因也在于此。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user