算法导论【复习】
教材:算法导论第三版
本博客内容均为自行整理,以供学过算法的同学快速回忆之用。
本人第一篇博客,当然要献给算法啦!博客是在复习的时候整理的,有点类似于记忆碎片,比较简略,欢迎大家在评论区讨论、补充、纠正。
算法导论期末复习大纲
【算法复杂度】:
假设所需计算机资源的量只和问题规模、算法输入和算法本身的函数相关。
时间复杂度:
用基本操作步数衡量,独立于机器。
在不同情况下算法复杂度也是不同的,常见的情况有最好情况下,平均情况下,最坏情况下的时间复杂度。
首先,是时间复杂度的三个概念O(), θ \theta θ(), ω \omega ω()。
【算法导论】P26,三张图有助于理解
- O O O() 渐进上界
{f(n):存在正常量c, n 0 n_0 n0,使得对所有n>= n 0 n_0 n0,有0<=f(n)<=cg(n)}
- θ \theta θ() 渐进紧确界
{f(n):存在正常量 c 1 c_1 c1、 c 2 c_2 c2和 n 0 n_0 n0,使得对所有n>= n 0 n_0 n0,有0<= c 1 c_1 c1g(n)<=f(n)<= c 2 c_2 c2g(n)}
- Ω \Omega Ω() 渐进下界
{f(n):存在正常量c, n 0 n_0 n0,使得对所有n>= n 0 n_0 n0,有0<=cg(n)<=f(n)}
另外:
1. ο \omicron ο()代表非渐进紧确上界, ω \omega ω()代表非渐进紧确下界。o(g(n)) = {f(n): 对任意正常数c>0,使得对所有n>= n 0 n_0 n0,有0<=f(n)<cg(n)}
2. O ( ) O() O()和 Ω \Omega Ω()如果非常紧的话都会趋向于 θ \theta θ()。(有一种紧确界的证明方式就是这样的)
3. O ( ) O() O()往往差了些也是对的,但是不准确,比如用O( n 100 n^{100} n100)来描述快速排序的平均时间复杂度也是对的,但是不如O(nlogn)来得确切。所以比较紧的界才有意义,能求出 θ \theta θ()最好啦。(另外,用 o ( n l o g n ) o(nlogn) o(nlogn)来描述快速排序的平均情况就不行,因为 ο \omicron ο()代表非渐进紧确上界,看那个定义中是没有等号的,要注意大O和小o的区别)。
根据递归式求 O O O()和 Ω \Omega Ω()的三种方法:
- 代入法P48:猜测复杂度式子,假设出来(可能需要带低阶的参数),代入递归式并证明。
- 递归树法P50:把递归树画出来,然后累加(可能会用到级数相关知识)。那种分成两颗不均匀子树的情况常用这种方法求解。
- 主方法P53:可以用递归树法推导,推导过程中会用到 n l o g b a = a l o g b n