From 46704e88640b9d741c877a5e1c1dbceb63b99018 Mon Sep 17 00:00:00 2001 From: Shine wOng <1551885@tongji.edu.cn> Date: Tue, 7 May 2019 16:18:21 +0800 Subject: [PATCH] update big O notation --- thu_dsa/chp1.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/thu_dsa/chp1.md b/thu_dsa/chp1.md index b80332b..f50344e 100644 --- a/thu_dsa/chp1.md +++ b/thu_dsa/chp1.md @@ -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记号时,可以直接忽略低次项的原因也在于此。 +