算法的数学基础

1. 函数的渐近的界

定义:设 f f f g g g 是定义域为自然数集 N \N N 上的函数.

  1. ∃ c > 0 , n 0 > 0 \exists c>0, n_0>0 c>0,n0>0,对 ∀ n ≥ n 0 \forall n\ge n_0 nn0,有 0 ≤ f ( n ) ≤ c g ( n ) 0 \le f(n) \le cg(n) 0f(n)cg(n)成立,则称 f ( n ) f(n) f(n)的渐近的上界是 g ( n ) g(n) g(n),记作 f ( n ) = O ( g ( n ) ) f(n)=\Omicron(g(n)) f(n)=O(g(n))

    对于 0 ≤ f ( n ) < c g ( n ) 0 \le f(n) < cg(n) 0f(n)<cg(n),记作 f ( n ) = ο ( g ( n ) ) f(n) = \omicron(g(n)) f(n)=ο(g(n))

  2. ∃ c > 0 , n 0 > 0 \exists c>0, n_0>0 c>0,n0>0,对 ∀ n ≥ n 0 \forall n\ge n_0 nn0,有 0 ≤ c g ( n ) ≤ f ( n ) 0 \le cg(n) \le f(n) 0cg(n)f(n)成立,则称 f ( n ) f(n) f(n)的渐近的下界是 g ( n ) g(n) g(n),记作 f ( n ) = Ω ( g ( n ) ) f(n)= \Omega(g(n)) f(n)=Ω(g(n))

    对于 0 ≤ c g ( n ) < f ( n ) 0 \le cg(n) \lt f(n) 0cg(n)<f(n),记作 f ( n ) = ω ( g ( n ) ) f(n)= \omega(g(n)) f(n)=ω(g(n))

  3. f ( n ) = O ( g ( n ) ) f(n)=\Omicron(g(n)) f(n)=O(g(n)),且 f ( n ) = Ω ( g ( n ) ) f(n)=\Omega(g(n)) f(n)=Ω(g(n)),则记作 f ( n ) = Θ ( g ( n ) ) f(n)=\Theta(g(n)) f(n)=Θ(g(n))

根据以上函数的渐近的界的定义,有如下几个定理

  • { f = O ( g ) , g = O ( h ) ⟹ f = O ( h ) f = Ω ( g ) , g = Ω ( h ) ⟹ f = Ω ( h ) f = Θ ( g ) , g = Θ ( h ) ⟹ f = Θ ( h ) \left\{ \begin{aligned} f &= \Omicron(g),\quad g = \Omicron(h) \Longrightarrow f = \Omicron(h)\\\\ f &= \Omega(g),\quad g = \Omega(h) \Longrightarrow f = \Omega(h) \\\\ f &= \Theta(g),\quad g = \Theta(h) \Longrightarrow f = \Theta(h)\end{aligned} \right. fff=O(g),g=O(h)f=O(h)=Ω(g),g=Ω(h)f=Ω(h)=Θ(g),g=Θ(h)f=Θ(h)

  • f = O ( h ) f=\Omicron(h) f=O(h) g = O ( h ) g=\Omicron(h) g=O(h) ⟹ \Longrightarrow f + g = O ( h ) f + g=\Omicron(h) f+g=O(h)

    f = Ω ( h ) f=\Omega(h) f=Ω(h) g = Ω ( h ) g=\Omega(h) g=Ω(h) ⟹ \Longrightarrow f + g = Ω ( h ) f + g=\Omega(h) f+g=Ω(h)

  • f f f g g g 是定义域为自然数集合 N \N N 上的非负函数

    如果 lim ⁡ n → ∞ f ( n ) g ( n ) = c > 0 \displaystyle\lim\limits_{n \rightarrow \infty}{\frac{f(n)}{g(n)}}=c>0 nlimg(n)f(n)=c>0,则 f ( n ) = Θ ( g ( n ) ) f(n)=\Theta(g(n)) f(n)=Θ(g(n))
    如果 lim ⁡ n → ∞ f ( n ) g ( n ) = 0 \displaystyle\lim\limits_{n \rightarrow \infty}{\frac{f(n)}{g(n)}}=0 nlimg(n)f(n)=0,则 f ( n ) = ο ( g ( n ) ) f(n)=\omicron(g(n)) f(n)=ο(g(n))
    如果 lim ⁡ n → ∞ f ( n ) g ( n ) = + ∞ \displaystyle\lim\limits_{n \rightarrow \infty}{\frac{f(n)}{g(n)}}=+\infty nlimg(n)f(n)=+,则 f ( n ) = ω ( g ( n ) ) f(n)=\omega(g(n)) f(n)=ω(g(n))

2. 常用函数的界

  • 多项式函数

    f ( n ) = a 0 + a 1 n + a 2 n 2 + ⋯ + a d n d f(n)=a_0+a_1 n+a_2 n^2 + \cdots +a_d n^d f(n)=a0+a1n+a2n2++adnd a d ≠ 0 a_d \neq 0 ad=0称为 d d d 次多项式, f ( n ) = Θ ( n d ) f(n)=\Theta(n^d) f(n)=Θ(nd)

  • 对数函数

    log ⁡ b n \log_b{n} logbn 称为对数函数,其满足以性质: a log ⁡ b n = n log ⁡ b a \displaystyle a^{\log_b{n}}=n^{\log_b{a}} alogbn=nlogba

    两边取 b b b 为底的对数

    对于每个 b > 1 b>1 b>1和每个 α > 0 \alpha>0 α>0,有 log ⁡ b n = ο ( n α ) \log_bn=\omicron(n^{\alpha}) logbn=ο(nα)

    对数函数的另一个性质是 log ⁡ a n = Θ ( log ⁡ b n ) \log_an=\Theta(\log_bn) logan=Θ(logbn)

    换底公式即可证明

  • 指数函数

    指数函数是指形如 f ( n ) = r n f(n)=r^n f(n)=rn 的函数,其中 r r r 为某个大于 1 1 1 的常数

    对每个 r > 1 r>1 r>1 和每个 d > 0 d>0 d>0,有 n d = ο ( r n ) n^d=\omicron(r^n) nd=ο(rn)

    指数函数增长比多项式快

  • 阶乘函数

    f ( n ) = n ! f(n)=n! f(n)=n! 是增长很快的函数,根据斯特灵公式,阶乘函数
    n ! = 2 π n ( n e ) n ( 1 + Θ ( 1 n ) ) n!=\displaystyle\sqrt{2\pi n}\displaystyle\left(\frac{n}{e}\right)^n\left(1+\Theta\left(\frac{1}{n}\right)\right) n!=2πn (en)n(1+Θ(n1))

    关于阶乘函数有以下结果:

    • n ! = ο ( n n ) \large n!=\omicron(n^n) n!=ο(nn)
    • n ! = ω ( 2 n ) \large n!=\omega(2^n) n!=ω(2n)
    • log ⁡ ( n ! ) = Θ ( n log ⁡ n ) \log(n!)=\Theta(n\log n) log(n!)=Θ(nlogn)
  • 取整函数

    • 向上取整: ⌈ x ⌉ \lceil x \rceil x
    • 向下取整: ⌊ x ⌋ \lfloor x \rfloor x

3. 常用复杂度排序

2 2 n > n ! > n ⋅ 2 n > ( 3 2 ) n > n log ⁡ log ⁡ n > n 3 > log ⁡ n ! = Θ ( n log ⁡ n ) > n > log ⁡ 2 n > log ⁡ n > log ⁡ log ⁡ n > n 1 log ⁡ n = Θ ( 1 ) \displaystyle 2^{2^n} \gt n!\gt n\cdot 2^n\gt(\frac{3}{2})^n\gt n^{\log\log n}\gt n^3 \gt \log n! = \Theta(n\log n) \gt n\gt \log^2 n\gt \log n \gt \log\log n\gt n^{\frac{1}{\log n}}=\Theta(1) 22n>n!>n2n>(23)n>nloglogn>n3>logn!=Θ(nlogn)>n>log2n>logn>loglogn>nlogn1=Θ(1)

4. 基本的求和的方法

  • 等差级数: ∑ k = 1 n a k = n ( a 1 + a n ) 2 \displaystyle\sum_{k=1}^{n}a_k=\frac{n(a_1+a_n)}{2} k=1nak=2n(a1+an)
  • 等比级数: ∑ k = 0 n a q k = a ( 1 − q n + 1 ) 1 − q \displaystyle\sum_{k=0}^{n}aq^k=\frac{a(1-q^{n+1})}{1-q} k=0naqk=1qa(1qn+1),特别地, ∑ k = 0 n x k = 1 − x n + 1 1 − x \displaystyle\sum_{k=0}^{n}x^k=\frac{1-x^{n+1}}{1-x} k=0nxk=1x1xn+1
  • 调和级数: ∑ k = 0 n 1 k = ln ⁡ n + O ( 1 ) \displaystyle\sum_{k=0}^{n}\frac{1}{k}=\ln n+\Omicron(1) k=0nk1=lnn+O(1)

5. 递推方程的求解

5.1 迭代归纳法

【例 1】求解汉诺塔算法的递推方程

算法的数学基础_第1张图片

【解】

算法的数学基础_第2张图片

5.2 差消法

【例 2】求解快速排序的时间复杂度 T ( n ) T(n) T(n) 的递推方程

算法的数学基础_第3张图片

【解】

算法的数学基础_第4张图片

5.3 递归树

呃呃呃,(⊙o⊙)…,只可意会,不可言传……

【例 3】求解递推方程

在这里插入图片描述

【解】

算法的数学基础_第5张图片

最左边的路径是最短路径,问题规模减少为原来的 1 3 \displaystyle\frac{1}{3} 31,最右边的路径是最长的路径,问题规模每次减少为原来的 2 3 \displaystyle\frac{2}{3} 32,最坏情况下考虑最长路径

算法的数学基础_第6张图片

为什么是 O ( n ) O(n) O(n) 而不是 n n n,因为左右字数下降速度不一致,右边到底了,左边还没下来,所以倒数几层的权值之和小于 n n n

5.4 主定理

a ≥ 1 , b > 1 a\ge 1, b>1 a1,b>1 为常数, f ( n ) f(n) f(n) 为函数, T ( n ) T(n) T(n) 为非负整数,且 T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n),则有以下结果:

  • f ( n ) = O ( n log ⁡ b a − ϵ ) , ϵ > 0 f(n)=O(n^{\log_b{a-\epsilon}}),\epsilon>0 f(n)=O(nlogbaϵ),ϵ>0,那么 T ( n ) = Θ ( n log ⁡ b a ) T(n)=\Theta(n^{\log_ba}) T(n)=Θ(nlogba)
  • f ( n ) = O ( n log ⁡ b a ) f(n)=O(n^{\log_b{a}}) f(n)=O(nlogba),那么 T ( n ) = Θ ( n log ⁡ b a log ⁡ n ) T(n)=\Theta(n^{\log_ba}\log n) T(n)=Θ(nlogbalogn)
  • f ( n ) = O ( n log ⁡ b a + ϵ ) , ϵ > 0 f(n)=O(n^{\log_b{a+\epsilon}}),\epsilon>0 f(n)=O(nlogba+ϵ),ϵ>0,且对于某个常数 c < 1 c<1 c<1 和所有充分大的 n n n a f ( n / b ) ≤ c f ( n ) af(n/b)\le cf(n) af(n/b)cf(n),那么 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))

你可能感兴趣的:(数据结构与算法分析)