算法复习_复杂度渐进分析

复习的时候周杰伦和陈奕迅真是比红牛还管用。
附上我的工作环境嘻嘻:

在这里插入图片描述
上正菜:

算法复杂度渐进分析

分治法思想

  • 将问题划分为一数量的子问题;
  • 递归地解决子问题,直到子问题的规模足够小可以直接求解;
  • 将子问题的解合并来得到原问题的解。

递归法时间复杂度分析

扩展法

通常适用于比较简单的表达式

例子:
T ( n ) = { θ ( 1 ) i f n = 1 ; 2 T ( n / 2 ) + Θ ( n ) i f n > 1. T(n) = \left\{ \begin{matrix} & \theta(1) \quad if \quad n=1; \\ & 2T(n/2) + \Theta(n) \quad if \quad n > 1. \end{matrix} \right. T(n)={θ(1)ifn=1;2T(n/2)+Θ(n)ifn>1.
扩展法步骤如下:
T ( n ) = 2 T ( n / 2 ) + c 1 n = 4 T ( n / 4 ) + 2 c 1 n / 2 + c 1 n = 8 T ( n / 8 ) + 4 c 1 n / 4 + 2 c 1 n / 2 + c 1 n … = 2 k T ( n / 2 k ) + c 1 n ( n + n + ⋯ + n ) i f ( n / 2 k ) = = 1 t h e n T ( n ) = c 2 2 k + c 1 ( n + n + . . . + n ) k = l o g n T ( n ) = Θ ( c 2 n + c 1 n l o g n ) = Θ ( n l o g n ) T(n) = 2T(n/2)+ c_1n \\ = 4T(n/4) + 2c_1n/2 + c_1n \\ = 8T(n/8)+4c_1n/4+2c_1n/2+c_1n \\ \dots \\ =2^k T(n/2^k) + c_1n(n+n+\dots+n) \\ if \quad (n/2^k) == 1 \quad then \\ T(n) = c_2 2^k+ c_1(n+n+...+n) \\ k = logn \\ T(n) = \Theta(c_2n+c_1nlogn) = \Theta(nlogn) T(n)=2T(n/2)+c1n=4T(n/4)+2c1n/2+c1n=8T(n/8)+4c1n/4+2c1n/2+c1n=2kT(n/2k)+c1n(n+n++n)if(n/2k)==1thenT(n)=c22k+c1(n+n+...+n)k=lognT(n)=Θ(c2n+c1nlogn)=Θ(nlogn)

替换法

这是一种最普遍的方法

  • 猜出解的形式
  • 通过归纳法验证
  • 求解常量

最关键的一步可以用一句话概括:就是证明: T ( n ) T(n) T(n)小于等于比下界还小的,大于等于上界还大的。

ex: T ( n ) = 4 T ( n / 4 ) + Θ ( n ) T(n) = 4T(n/4) + \Theta(n) T(n)=4T(n/4)+Θ(n)
首 先 证 明 T ( n ) ≤ c 1 n 2 , 当 n > n 0 时 恒 成 立 。 T ( n ) = 4 T ( n / 2 ) + d n ≤ 4 c ( n / 2 ) 2 + d n = c n 2 + d n 首先证明 T(n)\leq c_1n^2, 当n>n_0时恒成立。\\ T(n) = 4T(n/2) + dn \\ \leq 4c(n/2)^2 + dn \\ =cn^2 + dn T(n)c1n2,n>n0T(n)=4T(n/2)+dn4c(n/2)2+dn=cn2+dn
我们此时无法证明出 T ( n ) ≤ c n 2 T_(n) \leq cn^2 T(n)cn2的确切形式,因此这种证明方式失败。

因此考虑减去低阶项来增强归纳假设
假 设 T ( n ) ≤ c 1 n 2 − c 2 n f o r n ≥ n 0 P r o o f : T ( n ) = 4 T ( n / 2 ) + d n ≤ 4 [ c 1 ( n / 2 ) 2 − c 2 ( n / 2 ) ] + d n = c 1 n 2 − 2 c 2 n + d n = c 1 n 2 − c 2 n + ( d − c 2 ) n i f T ( n ) ≤ c 1 n 2 − c 2 n t h e n d < c 2 当 d < c 2 时 得 证 。 假设T(n) \leq c_1n^2 -c_2n \quad for \quad n\geq n_0 \\ Proof: \\ T(n) = 4T(n/2) + dn \\ \leq 4[c_1(n/2)^2-c_2(n/2)]+dn \\ = c_1n^2-2c_2n+dn \\ = c_1n^2 - c_2n + (d-c_2)n\\ if \quad T(n)\leq c_1n^2-c_2n\\ then \quad d<c_2 \\ 当d<c_2时得证。 T(n)c1n2c2nfornn0Proof:T(n)=4T(n/2)+dn4[c1(n/2)2c2(n/2)]+dn=c1n22c2n+dn=c1n2c2n+(dc2)nifT(n)c1n2c2nthend<c2d<c2
附上一个完整证明,还是直接写爽!

在这里插入图片描述

递归树

有时替换法非常棘手,因为它主要考观察和猜测

我们可以通过使用递归树来帮助我们观察,并通过替换法去证明我们观测结果的正确与否。

ex: T ( n ) = T ( n / 2 ) + Θ ( n ) T(n) = T (n/2) + \Theta(n) T(n)=T(n/2)+Θ(n)

在这里插入图片描述

主方法

(太难记了,不建议使用)

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值