1 分治主要思想
- 将问题分割成多个子问题(divide )
- 递归地解决问题
- 把子问题的结果合并成总问题的结果(conquer)
2 排序
2.1 插入排序
假设输入是A[1...n]
2.1.1 时间复杂度
令T(n)表示排序n个元素的时间复杂度
于是我们有
2.2 合并排序
在第三步合并的时候,我们需要创建大小为n的数组C,从左向右扫描A和B,将小的元素放入C中,然后将相应的指针向后移动
2.2.1 时间复杂度
那么,如何计算这个呢?我们使用递归树来计算之
1)假设元素个数n是2的幂,root为n的递归树表示T(n)
表示递归树T(n)是由两棵子树T(n/2)和自己本身root的值O(n)相加求得的
那么整个T(n)可以表示为:
不难发现,递归树每一层自己的值都是O(n)数量级的
所以整棵递归树T(n)=O(n)*O(树的深度)
由于递归树是一棵二叉树,所以对于有n个节点,它的深度为O(logn)
所以T(n)=O(nlogn)
2)假设元素个数不是2的幂,我们验证一下T(n)是不是依然是O(nlogn)
所以合并排序的时间复杂度是O(nlogn)
另一种解法:换元迭代
3 主定理
可以想成:哪个大T(n)就跟哪个
3.1 证明主定理:
使用换元迭代法
说明一下最后一行
(两边取logb即可说明)
-
情况1
情况2 ![](https://i-blog.csdnimg.cn/blog_migrate/025bcccc5878c3515560f83821cd492a.png)
情况3 ![](https://i-blog.csdnimg.cn/blog_migrate/61754d45e560a59fb6d60787cbe9e2b6.png)
3.2 主定理举例
T ( n ) = 2T ( n/2 ) + na=2,b=2——>f(n)=Θ(n)所以T(n)=Θ(nlogn)
3.2.1 不能使用主定理的例子
和2.2.1 解法1一样
3.2.2 递推方程中
的处理
先猜想解,然后用数学归纳法证明
4 快排
![](https://i-blog.csdnimg.cn/blog_migrate/fe95d17b513db9a5d29eda8111ad6c10.png)
4.1 时间复杂度
每一层之和也是O(n),一共也是O(logn)层【“下降”得最慢得是3/4那一系,那一次有
层】
所以总的时间复杂度也是O(nlogn)
定理:快排的期望时间复杂度是O(nlogn)
期望什么呢?不同的输入,会得到不同的执行时间。对于一种固定的取pivot的方法,会存在一些输入,使得算法的时间复杂度来到O(n^2)
4.1.1 随机算法
随机算法是得到一系列随机数字,在执行过程中做出随机决策的算法
它有两个分支:
蒙特卡洛算法:执行固定数量级步数,并且生成一个算法,正确率大于等于1/3
——O(n^2)级蒙特卡洛算法
——为什么是1/3?这个不重要,别的数字也可以,只要是一个actual number即可
比如我进行一次实验,那么成功的概率是1/3,失败的概率是1-1/3=2/3
进行两次实验,那么成功的概率是1-(2/3)*(2/3)=5/9,失败的概率是1-5/9=4/9
进行三次实验,成功的概率是19/27,失败的概率是8/27
拉斯维加斯算法:始终得出对的结果,执行时间是随机变量。
4.1.2 用拉斯维加斯算法看快排(随即快排)
拉斯维加斯算法,运行时间是一个多项式级的随机变量
使用标准快排,每一次随机选择一个点作为pivot点
所以说,固定取pivot的方法,随机一种输入;和固定输入,随机取pivot,两者的时间复杂度相似。
5 基于比较的排序算法的下边界![](https://i-blog.csdnimg.cn/blog_migrate/eb2699ae9fbae28c5a8095c0e3ccb440.png)
证明方法:决策树:
任何一个基于比较的算法都可以用决策树来模拟:
1)决策树的树叶是一种input元素的排列方式
2)树的深度是一次计算最多的比较次数
一个基于比较的算法可以用用决策树来模拟
——一共有n!中不同的排列方法
——>决策树需要有n!个叶子
——>有n!片叶子的树至少需要O(log(n!))=O(nlogn)的深度
——>任何一个排序对应的决策树,至少O(nlogn)
5.1 不基于比较的排序算法
假设所有的值都在1~m之间:
时间复杂度是O(n+m) 【一开始建m个元素的数组O(m)+遍历每个元素进行计数O(n)】
6 其他分治的例子
6.1 芯片测试
6.1.1 题目描述
6.1.2 解题思路
6.1.3 复杂性分析
每一轮分治至少可以减少一半的规模
6.2 求幂
6.2.1 问题描述
6.2.2 解题思路
6.2.3 复杂性分析
6.2.4 求幂的拓展应用:分治法求解斐波那契数列
我们证明一下
首先
满足条件
假设
以及之前的矩阵均满足条件
那么根据定义
=