本栏目(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的更多相关文章

  1. MIT算法导论笔记

    详细MIT算法导论笔记 (网络链接) 第一讲:课程简介及算法分析 (Sheridan) 第二讲:渐近符号.递归及解法  (Sheridan) 第三讲:分治法(1)(Sheridan) 第四讲:快排及随 ...

  2. MIT算法导论——第五讲.Linear Time Sort

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

  3. MIT算法导论——第一讲.Analysis of algorithm

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

  4. MIT算法导论——第二讲.Solving Recurrence

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

  5. MIT算法导论——第四讲.Quicksort

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

  6. MIT算法导论课程

    http://open.163.com/movie/2010/12/G/F/M6UTT5U0I_M6V2T1JGF.html

  7. 算法导论----VLSI芯片测试; n个手机中过半是好的,找出哪些是好手机

    对于分治(Divide and Conquer)的题目,最重要是 1.如何将原问题分解为若干个子问题, 2.子问题中是所有的都需要求解,还是选择一部分子问题即可. 还有一点其实非常关键,但是往往会被忽 ...

  8. [Algorithm] 如何正确撸<算法导论>CLRS

    其实算法本身不难,第一遍可以只看伪代码和算法思路.如果想进一步理解的话,第三章那些标记法是非常重要的,就算要花费大量时间才能理解,也不要马马虎虎略过.因为以后的每一章,讲完算法就是这样的分析,精通的话 ...

  9. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

随机推荐

  1. html5 app开发重大消息-腾讯在技术端推进Html5生态发展

    中新网5月3日电 日前,腾讯正式发布腾讯浏览服务(Tencent Browser Service,以下简称TBS),宣布为合作伙伴提供整合腾讯底层技术.内容框架.广告体系以及大数据等多方面能力的升级浏 ...

  2. 错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

    下载2007 Office system 驱动程序:数据连接组件安装 http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b ...

  3. Spark菜鸟学习营Day2 分布式系统需求分析

    Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ...

  4. Python中docstring文档的写法

    该写法根据Python的PEP 257文档总结. 类的函数称为方法(method),模块里的函数称为函数(function) 每一个包,模块,类,函数,方法都应该包含文档,包括类的__init__方法 ...

  5. 查看SQL Server 备份信息

    RESTORE HEADERONLY FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008\MSSQL\Back ...

  6. 屏蔽ios7中某个页面的默认手势滑回返回

    - (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:YES];self.navigationController.in ...

  7. ffmpeg 错误码

    av_read_frame, av_write_frame等 经常会返回负值也即写数据包失败.不同的负值代表不同的含义,可以根据错误码定义,定位问题. #define EPERM 1 /* Opera ...

  8. C# - 设置DLL的属性Embed Interop Type 设为False

    错误: Error msg: A reference was created to embedded interop assembly. because of an indirect referenc ...

  9. 【BZOJ】【1529】 【POI2005】ska Piggy banks

    本来以为是tarjan缩点……但是64MB的空间根本不足以存下原图和缩点后的新图.所以呢……并查集= = orz hzwer MLE的tarjan: /************************ ...

  10. oracle——表修改语句集合

     alter table table_name modify column_name default 0;