关于程序的时间复杂度


主定理

递归中,一个规模为n的问题分成a个规模为n/b的问题,额外计算复杂度为c*n^d,那么
\[T(n) = O(n^d\log{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层,有a^j个子问题,每个子问题规模为n/b^j。
则第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) = 2\sum_{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\]


用数学方法求程序复杂度

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

转载于:https://www.cnblogs.com/chy-2003/p/9639494.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值