麻省理工学院公开课-第三讲:分治法
http://blog.csdn.net/ai552368625/article/details/38108459
http://www.cnblogs.com/banli/archive/2013/06/01/3112583.html
主定理:
分治思想
- Devide:把问题分为若干子问题.
- Conquer:递归地解决子问题.
- Combine:合并子问题的解.
分治思想的应用:
归并排序:
- 将长度为n的待排序数组分为两个子数组.
- 递归地对子数组进行归并排序.
- 合并排序好的子序列.
T(n) = 2T(n) + O(n) = Θ(lgn).
二分查找:
- 找到有序数组的中间元素.
- 递归地在满足条件的一个子数组中查找.
- nothing
数的乘幂(an):
基本实现方法:n个a相乘n-1次. T(n)=Θ(n).
分治法:
斐波那契数列:
- 基本方法-递归法:
欲计算 F(n),则要计算 F(n-1),F(n-2),etc.时间复杂度为指数级 T(n) = Ω(φn),φ=(黄金分割点)
- Bottom-Up法:
按序计算 F(0),F(1),F(2),...,F(n).每个F(n)只需计算一次,下一次可以使用上一次的计算结果.改进后 T(n)=Θ(n).
- 朴素平方递归法:
该方法用到斐波那契数列的一个性质,即,
,φ=(黄金分割点),并取至最接近的整数,那就是第n位斐波那契数。 T(n) = Θ(lgn).
该算法理论上可行,实际上这种方法在现有条件下不能实现,在实际中的机器上,由于浮点运算的精度会受到四舍五入的影响,最终得不到正确的答案.
- 平方递归法:
该方法用到斐波那契数列的另一个性质,即
矩阵乘积(方阵):
- 矩阵分块,实现分治:
T(n)=Θ(n3)
- 斯特拉森算法
T(n)=Θ(nlg7).