• 【墨鳌】【Master Method】


    Master Method

    • 分治递归,是我们常用的程序设计思想,如何衡量一个递归算法设计的好坏呢?
    • 这就使得我们得去思考:递归算法的复杂度如何计算

    Master Method 是这样描述的:

    \[T(n)=kT(n/m)+f(n),f(n)=n^d \]

    \[T(n)\in \begin{cases} O(n^d) & k<m^d\\ O(n^d\cdot\log_m{n}) & k=m^d\\ O(n^{\log_m{k}}) & k>m^d\\ \end{cases} \]

    递归树

    graph TD root("f(n)") son1("f(n/m)") son2("......") son3("f(n/m)") leaf1("f(n/m^i)") leaf2("f(n/m^i)") leaf3("f(n/m^i)") leaf4("f(n/m^i)") leaf5("f(n/m^i)") leaf6("f(n/m^i)") leaf7("f(n/m^i)") leaf8("f(n/m^i)") leaf9("f(n/m^i)") root-->son1 root-->son2 root-->son3 son1-...->leaf1 son1-...->leaf2 son1-...->leaf3 son2-...->leaf4 son2-...->leaf5 son2-...->leaf6 son3-...->leaf7 son3-...->leaf8 son3-...->leaf9
    • 第一层:\(1\)

    • 第二层:\(k\)

    • 第三层:\(k^2\)

    • \(i+1\) 层:\(k^i\)

    考虑叶子节点 \(f(n/m^i)=1\Longrightarrow n=m^i\iff i=\log_m{n}\)

    推导过程

    \[\because f(n)=n^d,\ i=\log_m{n}\\ \therefore T(n)=\Sigma f = f(n)+[k\cdot f(n/m)]+[k^2\cdot f(n/m^2)]+\dots+[k^i\cdot f(n/m^i)] \\ ​ = (n^d)[1+\frac{k}{m^d}+(\frac{k}{m^d})^2+\dots+(\frac{k}{m^d})^i] \\ \]

    中括号内,为等比数列求和,公比 \(q\) 分类讨论

    \[S=1+\frac{k}{m^d}+{(\frac{k}{m^d})}^2+...+{(\frac{k}{m^d})}^i, \qquad q=\frac{k}{m^d} \]

    考虑 \(i\rightarrow+\infty\)

    1. when $ q=1,\ S=i+1=i$

    2. when \(q<1,\ S=\frac{1}{1-q}\)

    3. when \(q>1,\ S=q^i\)

    $ \therefore T(n)=n^d\cdot S$ 分三类讨论:

    1. \(q=1\iff k=m^d\qquad T(n)=n^d\cdot i=n^d\cdot \log_m{n}=O(n^d\cdot \log_m{n})\)
    2. \(q<1\iff k<m^d\qquad T(n)=n^d\cdot \frac{1}{1-q}=C\cdot n^d=O(n^d)\)
    3. \(q>1\iff k>m^d\qquad T(n)=n^d\cdot q^i=n^d\cdot (\frac{k}{m^d})^{(\log_m{n})}=O(n^{\log_m{k}})\qquad (*)\)

    \((*)\) 推导:

    \(n^d\cdot (\frac{k}{m^d})^{(\log_{\text{m}}{n})}\)

    \(=n^d\cdot \frac{k^{\log_{\ \text{ m}}{n}}}{(m^d)^{\log_{\ \text{ m}}{n}}}\)

    \(=n^d\cdot \frac{k^{\log_{\ \text{ m}}{n}}}{(m^{\log_{\ \text{ m}}{n}})^d}\)

    \(=n^d\cdot \frac{k^{\log_{\ \text{ m}}{n}}}{n^d}\)

    \(=k^{\log_{\ \text{m}}{n}}\)

    \(=k^{\frac{\log_{\ \text{ k}}{n}}{\log_{\ \text{ k}}{m}}}\)

    \(=(k^{\log_{k}{n}})^\frac{1}{log_{\ k}{\ m}}\)

    \(=n^{\log_{m}{k}}\)

    练习题

    master method

    \[T(n)\in \begin{cases} O(n^d) & k<m^d\\ O(n^d\cdot\log_{m}{n}) & k=m^d\\ O(n^{\log_m{k}}) & k>m^d\\ \end{cases} \]

    $ 1.\quad T(n)=T(n/3)+n$

    \[k=1,m=3,d=1\Longrightarrow k<m^d\\ T(n)=O(n^d)=\Theta(n) \]

    $ 2.\quad T(n)=T(2n/3)+1$

    \[k=1,m=3/2,n=0\Longrightarrow k=m^d\\ T(n)=O(n^dlog_m{n})=\Theta(\log{n}) \]

    $ 3.\quad T(n)=4T(n/2)+n$

    \[k=4,m=2,d=1\Longrightarrow k>m^d\\ T(n)=O(n^{\log_m{k}})=\Theta(n^2) \]

    $ 4.\quad T(n)=2T(n/2)+n$

    \[k=2,m=2,n=1\Longrightarrow k=m^d\\ T(n)=O(n^dlog_m{n})=\Theta(n\log{n}) \]

  • 相关阅读:
    bzoj 2038 [2009国家集训队]小Z的袜子(hose)
    搭配飞行员
    codevs 1022 覆盖
    Tyvj-1338 QQ农场
    bzoj 3894 文理分科
    bzoj 1877 [SDOI2009]晨跑
    poj 3304 判断是否存在一条直线与所有线段相交
    poj 2318 向量的叉积二分查找
    poj 3608 凸包间的最小距离
    LA 4728 旋转卡壳算法求凸包的最大直径
  • 原文地址:https://www.cnblogs.com/JasonCow/p/16114842.html
Copyright © 2020-2023  润新知