zoukankan      html  css  js  c++  java
  • 关于程序的时间复杂度


    主定理

    递归中,一个规模为n的问题分成a个规模为n/b的问题,额外计算复杂度为c*n^d,那么

    [T(n) = O(n^dlog{n})(a = b^d) ]

    [T(n) = O(n^d) (a < b^d) ]

    [T(n) = O(n^{log_{b}{a}}) (a > b^d) ]

    证明

    我们画出递归树,则递归树共有logb(n)+1层。对于第j层,有aj个子问题,每个子问题规模为n/bj。
    则第j层所用时间为

    [a ^ j c (frac{n}{b^j}) ^ d = c n ^ d (frac{a}{ b ^ d}) ^ j ]

    接下来求所有层的和

    [TotalWork = c n ^ d sum_{j=0}^{log_b n}(a / b ^ d) ^ j ]

    根据a与b^d的大小讨论,易得主定理中结论

    tip

    若不为平均分,则设最大的一部分为p*n(0 < p < 1),则树的深度为$$log_{1/p}(n) + 1$$又由于$$log_{1/p}(n) = frac{log(n)}{log(1/p)}$$
    所以深度依旧是log(n)级别


    更多关于主定理见这里


    快排复杂度分析

    由于快排分割随机,所以我们考虑平均复杂度

    [T(n) = T(i) + T(n - i) + c n ]

    [E(T(i)) = frac{1}{n}sum_{j = 0}^{ n - 1}T(j) ]

    所以有$$E(T(n - i)) = E(T(i))$$

    [T(n) = frac{2}{n} sum_{j=0}^{n-1}T(j) + cn ]

    两边同乘以n

    [nT(n) = 2sum_{j=0}^{n-1}T(j) + cn ^ 2 ([1]) ]

    又有

    [(n - 1)T(n - 1) = 2 sum_{j=0}^{n-2}T(j) + c(n - 1) ^ 2 ([2]) ]

    [1] - [2] 得

    [nT(n) = (n + 1)T(n - 1) + 2cn + c ]

    两边同除n*(n+1)得

    [frac{T(n)}{n + 1} = frac{T(n - 1)}{n} + frac{2c}{ n + 1} + frac{c}{n (n + 1)} ]

    累加求和,得

    [frac{T(n)}{n + 1} = frac{T(1)}{ 2} + 2cln(n) + 2cγ $$ //γ为欧拉常数 所以$$T(n) ≈ 2cnln n]


    用数学方法求程序复杂度

    当然是根据递推求通项咯!这个坑有空来补

  • 相关阅读:
    Linux安装python3.6
    Django之Model操作
    Django
    html学习笔记-XML-Javascript
    html学习笔记-XML
    html学习笔记-DOM
    在IDEA中编辑struts国际化properties文件
    Java中的Serializable接口和transient关键字
    关于Kettle的事务和转换内步骤的顺序执行
    Mac、Linux下两个Emacs共享一个配置文件
  • 原文地址:https://www.cnblogs.com/chy-2003/p/9639494.html
Copyright © 2011-2022 走看看