算法学习笔记(3)——分治法,Fibonacci数列,Strassen算法
来源:互联网 发布:java工程师需要学什么 编辑:程序博客网 时间:2024/05/01 22:02
- 作者:Rockics(http://blog.csdn.net/Rockics )
- 转载请注明出处
本课的主讲是Erik,讲了算法设计中特别重要的思想之一:分治法。好好体会这一课的精华。由于本人英文水平太差,这一课前前后后加起来的时间差不多一天。最后的VLSI问题还是没有听的太明白?求什么?
分治法将会用到很多的递归技术,分治法的分割基本步骤:
1:分--减小问题规模
2:治--处理问题
3:合并--这一步不是必须的,比如说,二分查找法就没有合并这一步
举例说明:
1.合并排序
2.二分查找
3.数的幂乘
直接的解法就是将X乘上n次,需要Theta(n)。我们可以使用分治的思想,将n个X的乘法分成2个X^(n/2)的子问题,并递归的求出X^(n/2)。
递归式为T(n) = T(n/2) + Theta(1)。用主方法可以解得T(n) = Theta(lgn)。何为主方法?第二讲有讲。必须记忆。
4.Fibonacci数列
最简单的方法就是递归解决,时间复杂度指数级别,BAD。
把式子展开成二叉树,观察不难发现,很多F_i我们重复计算了好些次,如果采用自低向上的方法来计算出每一个F_i,一直到F_n,这可以在线性时间内解决问题。这事典型的空间换时间做法,值得。
或者可以有另一种想法,我们可以利用斐波纳契数的一个性质,公式也不大出来了,和黄金分割点有关那个性质。不过,这玩意,你真得需要好好考虑数值稳定性的问题了。
还有办法可以进一步减小时间复杂度。Theta(lg n)!!!不过这需要了解一些Fibonacci数列的性质,[(Fn+1,Fn),(Fn,Fn-1)]=[(1,1),(1,0)]的n次方。这个式子可以用归纳法证明。前面数的幂乘的方法可以推广到矩阵的幂乘上,每一步的操作仍然是Theta(1),不再赘述。
5.矩阵乘(28章)
还记得以前学习C语言时候写的完全根据线性代数书上来的方法,还一阵陶醉。这的复杂度,这需要Theta(n^3)的时间。如果我们使用分治法来设计算法,最直观的想法是将矩阵划成块,需要8个矩阵乘和4个矩阵加法,8个矩阵乘用递归来解,时间复杂度Theta(n^3)。呵呵,命运呀。
隆重推出,Strassen算法,书上有详细证明。使用1+1=2做计算时候,从来不想着如何去证明1+1=2,使用这些算法的时候呀,也该不要想那么多,用上就是了。
最后一个分治法的例子,是关于VLSI的,说实话,我还是没有太明白这个例子的背景,虽然明白他的分析,但是:在干吗?了然的同学希望留个言指点一下,谢谢。
- 算法学习笔记(3)——分治法,Fibonacci数列,Strassen算法
- 【算法学习】POJ3070——利用分治法来计算Fibonacci数列的值
- 算法导论学习笔记—Strassen算法的Java实现
- 第4章 分治策略——strassen算法
- 分治法 Strassen算法计算方阵相乘
- 算法学习笔记——分治法
- 五大常用算法(一) 分治算法(3) Strassen矩阵乘法
- Strassen算法笔记
- 算法导论-3 divide-and-conquer-strassen-fibonacci-polynomial-multiplication
- 算法思想学习系列:分治法——求数列的逆序数
- 第四章 4.2矩阵乘法的Strassen算法(分治)
- 矩阵相乘算法——Strassen算法
- Strassen矩阵算法分析及其C++实现 递归分治法(转)
- Strassen矩阵算法分析及其C++实现 递归分治法(转)
- Fibonacci数列问题算法
- Fibonacci数列 算法
- Fibonacci 数列算法
- 算法之数列 Fibonacci
- 大端和小端(网络字节序和主机字节序)
- 【转】throw 和 throw ex 的区别
- TCP三次握手及四次挥手详细图解
- 缓存
- SuperMap 控件的操作状态常量
- 算法学习笔记(3)——分治法,Fibonacci数列,Strassen算法
- 使用Jad或JadClipse进行反编译
- 网友贴,借鉴下
- 2011-04-02
- 安装vim 以及Vim介绍比较
- windows消息处理过程---消息pump
- Android学习笔记(二一):有趣的widget-日期和时间
- oralce函数大全
- MFC Windows 程序设计->键盘加速键