大 O 符号
函数 g(n) 是函数 f(n) 的渐进上界 aymptotic upper bound 表述为
f(n)=O(g(n))
如果有 正常数 c 与 n0 使得 0≤f(n)≤cg(n) 对所有 n≥n0
即 limsupn→∞g(n)f(n)<∞
集合表述法
O(g(n))表示函数集合 O(g(n))={f(n)∣∃ c,n0>0 s.t. 0≤f(n)≤cg(n) for n≥n0}
所以很多时候我们也写成 f(n)∈O(g(n))
大 Ω 符号
对于函数 g(n) 是一个 渐进下界 f(n) 表述为
f(n) = \Omega(g(n))$$ 表示存在一个常数 $c$ 和 $n_0$ 使得 $0 \le cg(n) \le f(n)$ 对所有 $n \ge n_0$
即 $\lim\inf_{n\to \infty}\frac{f(n)}{g(n)} > 0$
## 大 $\Theta$ 符号
对于函数 $g(n)$ 是一个渐进紧密界 $f(n)$ 表述为
$$f(n) = \Theta(g(n))$$ 表示存在常数 $c_1,c_2$ 和 $n_0$ 使得 $0 \le c_1g(n) \le f(n) \le c_2g(n)$ 对所有 $n \ge n_0$
### $\Theta$ 定理
$$\Theta(g(n)) = O(g(n)) \cap \Omega(g(n))
排序算法的复杂度分析
比较次数定理
对于 n 个元素,任意对比算法最多需要 Ω(nlgn) 次比较
证明
由于合格的排序算法需要能提供所有的排列可能性,即我们化成决策树的形式,就会有 n! 种叶子,连接这些叶子,那么对于二叉树
斯特林公式
如何计算 (nk) 如果当 n,k 非常大的时候?
阶乘的拟合
n!∼2πn(en)n
这是离散形式的渐进拟合,这个公式在n很小的时候也十分接近原函数
但是我们可能对连续的函数更感兴趣,即
\Gamma(x) = \int_0^{\infty} t^{x-1}e^{-t}dt $$ 那么我们可以化简这个积分公式
$$ n! = \int_0 ^{\infty} x^n e^{-x}dx = \int_0^{\infty} e^{n\ln x - x}dx
然后,设 f(x):=x−nlnx 那么我们求导,得到 f′(x)=1−xn=0⇒x=n 那么我们可以得到 f(x) 在 x=n 处取得最小值,并且对于二阶导 f′′(x)=x2n∣x=n=n1 是一个凸函数
因此我们使用 −f 找到最小值,因此,我们可以在这里使用泰勒展开:
f(x)∼n−nlnn+21n1(x−n)2
因此我们将这个公式带回原积分公式 ∫0∞enlnx−xdx∼∫0∞enlnn−n−21n1(x−n)2dx∼21enlnn−n∫0∞e−21n1(x−n)2dx∼21e−nnn2πn
主定理 Master Theorem
如果函数 T(n)=aT(n/b)+f(n) 那么
- T(n)=Θ(nlogba) 如果 f(n)=O(nlogba−ϵ) for some ϵ>0
- T(n)=Θ(nlogbalogn) 如果 f(n)=Θ(nlogba)
- T(n)=Θ(f(n)) 如果 f(n)=Ω(nlogba+ϵ) for some ϵ>0 且如果 af(n/b)≤cf(n) 对某些 c<1 与足够大的 n