MIT算法导论——第三讲.The Divide-and-Conquer
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记。所有内容均来自MIT公开课Introduction to Algorithms中Charles E. Leiserson和Erik Demaine老师的讲解。(http://v.163.com/special/opencourse/algorithms.html)
第三节-------分治法 The Divide-and-Conquer
这节课的主要内容是介绍分治法的思想,以及一些应用分治法思想的算法示例,并结合上节课的主定理方法分析算法的性能。
所谓分治法,即分而治之,各个击破。其一般的算法设计步骤是:
1、Divide。即分,将问题拆分成几个子问题;
2、Conquer。即治,通过递归的方法分别解决第一步中子问题;
3、Combine。即合,将各个子问题的结果合并起来便得到整个问题的解决方案。
一、归并排序
如下图所示是归并排序中的分治法思想,根据设计思想便很容易得到归并排序的效率递归式。得到递归式后,便容易发现其满足主定理方法的Case 2,因此得到归并排序的复杂度为Θ(nlgn)。
二、二分查找
如下图所示是二分查找中的分治法思想,同理得到递归式后,便容易发现其满足主定理方法的Case 2,因此得到归并排序的复杂度为Θ(lgn)。
三、乘方a^n
为了计算乘方数a^n,传统的做法(所谓的Naive algorithm)就是循环相乘n次,算法效率为Θ(n)。但是如果采用分治法的思想,算法效率可以提高到Θ(lgn),如下图所示。
四、计算斐波那契数列
Fibonacci数列应该也算是耳熟能详,它的递归定义如上图所示。求解斐波那契数列的方法也较多,主要有如下几种。
1. 朴素递归算法(Naive recursive algorithm)
这时的算法效率为Ω(φ^n),指数级别的。其中φ = (1 + 5^½) / 2,即黄金分割比率。
2. 朴素递归平方算法(Naive recursive squaring)
这个算法主要根据斐波那契数列的一条数学性质而来。该性质表明,斐波那契数列F(n)即为φ^n / 5^½向下取整。这样,问题的求解于是变成了一个求乘方的问题,所以算法的效率为Θ(lgn)。
但是这个方法是不太靠谱的,主要是当n比较大时,由于硬件的限制计算机中的浮点运算得到的结果与真实值就产生误差了。
3. 自底向上算法(Bottom-up)
考虑到1中的简单递归算法,为了求解F(n),需要同时递归求解F(n - 1)和F(n - 2),显然这样就做了大量的重复工作。采用自底向上的算法即可避免这样的冗余。要计算F(n),则依次计算F0,F1,F2。。。Fn,这时计算Fn只需要利用前两个结果即可,这样算法效率提高到了Θ(n)。
4. 递归平方算法(Recursive squaring)
该算法也是基于一个定理,定理以及证明过程如下图所示。这样,问题的求解即成为了矩阵的乘方问题,算法效率于是提高到了Θ(lgn)。
五、矩阵乘法
如上图所示即为矩阵乘法问题的描述,关于矩阵的乘法目前的主要方法有如下几种。
1. 常规算法(Standard algorithm)
矩阵的乘法,首先想到的当然就是如下的算法,不难看出该算法的效率为Θ(n^3)。
for i ← 1 to n
do for j ← 1 to n
do c[i][j] ← 0
for k ← 1 to n
do c[i][j] ← c[i][j] + a[i][k]⋅ b[k][j]
2. 分治法算法(Divide-and-conquer algorithm)
矩阵乘法中采用分治法,第一感觉上应该能够有效的提高算法的效率。如下图所示分治法方案,以及对该算法的效率分析。有图可知,算法效率是Θ(n^3)。算法效率并没有提高。
3. Strassen算法(Strassen's algorithm)
鉴于2中的分治法方案无法有效提高算法的效率,要想提高算法效率,由主定理方法可知必须想办法将2中递归式中的系数8减少。Strassen提出了一种将系数减少到7的分治法方案,如下图所示。
很难想象Strassen是如何想出这个方案的,不过它确实将原来递归式中系数由8减小到了7。如下图所示是该算法的算法效率分析:
这样,Strassen算法将矩阵的乘法效率提高到了Θ(n^2.81)。尽管这个2.81在数字上看起来并没有提高多少,但是由于算法效率本身就是指数级的,所以当n比较大时(n ≥ 30在现代的机器上),Strassen算法的优势便已经很明显了。
当然,还有很多关于矩阵运算的优化算法。现在理论上矩阵乘法的效率最好的是:Θ(n^2.376…)。但是在这众多的优化算法中,Strassen算法却是最简单的。
MIT算法导论——第三讲.The Divide-and-Conquer的更多相关文章
- MIT算法导论笔记
详细MIT算法导论笔记 (网络链接) 第一讲:课程简介及算法分析 (Sheridan) 第二讲:渐近符号.递归及解法 (Sheridan) 第三讲:分治法(1)(Sheridan) 第四讲:快排及随 ...
- MIT算法导论——第五讲.Linear Time Sort
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...
- MIT算法导论——第一讲.Analysis of algorithm
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...
- MIT算法导论——第二讲.Solving Recurrence
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...
- MIT算法导论——第四讲.Quicksort
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...
- MIT算法导论课程
http://open.163.com/movie/2010/12/G/F/M6UTT5U0I_M6V2T1JGF.html
- 算法导论----VLSI芯片测试; n个手机中过半是好的,找出哪些是好手机
对于分治(Divide and Conquer)的题目,最重要是 1.如何将原问题分解为若干个子问题, 2.子问题中是所有的都需要求解,还是选择一部分子问题即可. 还有一点其实非常关键,但是往往会被忽 ...
- [Algorithm] 如何正确撸<算法导论>CLRS
其实算法本身不难,第一遍可以只看伪代码和算法思路.如果想进一步理解的话,第三章那些标记法是非常重要的,就算要花费大量时间才能理解,也不要马马虎虎略过.因为以后的每一章,讲完算法就是这样的分析,精通的话 ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
随机推荐
- 搭建eclipse环境下 Nutch+Mysql 二次开发环境
最近看了下Nutch,目前Nutch最新版本2.3.1,支持Hbase.MongoDB等存储,但在搭建和测试过程中发现对Mysql 的支持好像有点问题. 后来将Nutch版本改为2.2.1.基于Nut ...
- LLVM language 参考手册(译)(2)
调用约定(Calling Conventions) LLVM functions, calls and invokes 可以带有一个可选的调用约定来指明调用方式.每一对 caller/callee(调 ...
- windows bat脚本实现ftp自动下载 删除
现在有一个需求就是把远程某个文件下面的图片,下载到本地,并且删除下载成功的的文件,而且远程目录下的那个图片会随时增加.假设一下如果所有的脚本都写好了,那么就需要调用windows上的计划任务定时执行脚 ...
- PHP:strpos()-返回字符串在另一个字符串中第一次出现的位置
strpos()函数返回字符串在另一个字符串中第一次出现的位置.如果没有找到该字符串,则返回false. 语法:strpos(sting, find [, start]) string ,必须,要搜索 ...
- linux 文件在磁盘上的表示
基本构成 分区就是把磁盘像比萨饼一样切成大小一样的扇形, 当然分区大小不一样扇形的大小也就不一样 上下一串盘片中,相同半径的磁道所组成的一个圆柱型的环壁,就称为柱面 在柱面组中, 比较重要的两个结构是 ...
- C# 反射学习总结
C#中的反射可以使得程序集和类型(类.结构.委托.接口和枚举)以及类型中的成员(方法.字段.属性.事件.参数.构造函数等)都成为变量在编程中动态调用.
- Makefile之wildcard
1.wildcard : 扩展通配符2.notdir : 去除路径3.patsubst :替换通配符 例子:建立一个测试目录,在测试目录下建立一个名为sub的子目录$ mkdir test$ cd t ...
- java 泛型通配符 extends, super
引自:http://sharewind.iteye.com/blog/1622164 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 ...
- 0x02全局变量和局部变量
全局变量在什么地方定义? .data和.data? 格式如下: 变量名 类型 初始值1,初始值2... 变量名 类型 重复数 dup(初始值1,初始值2,...) 变量名 类型 ? 类型有哪些? 字节 ...
- 【原创】书本翻页效果booklet jquery插件系列之简介
booklet jquery插件系列之简介 本文由五月雨恋提供,转载请注明出处. 一.安装 1.添加CSS和Javascript 添加booklet CSS文件到你的页面. <link rel= ...