本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记。所有内容均来自MIT公开课Introduction to Algorithms中Charles E. Leiserson和Erik Demaine老师的讲解。(http://v.163.com/special/opencourse/algorithms.html

第二节-------渐近符号、递归及解法 Solving Recurrence

第二节课的内容比较偏数学化,没有算法方面的知识。但尽管如此,听着也还是比较舒服易懂。总结起来,主要有如下几个知识点。

1.渐近符号。

a、O符号。例如f(n) = O(g(n)),表示存在c > 0, n0 > 0使得0 ≤ f(n) ≤ cg(n )对于所有n ≥ n0时成立。也就是说,f(n)的复杂度最多与g(n)一个数量级,即小于等于。例如,2n^2 = O(n^3)。注意这里的等号是不对称的,只能从左到右成立反之则不成立,更形象的是记做2n^2 ∈ O(n^3)。

b、Ω符号。例如f(n) = Ω(g(n)),表示存在c > 0, n0 > 0使得0 ≤ cg(n ) ≤ f(n) 对于所有n ≥ n0时成立。也就是说,f(n)的复杂度最少与g(n)一个数量级,即大于等于。例如,n^(1/2) = Ω(lgn),应该这样理解,对于充分大的n,根号n至少是lgn的常数倍。

c、o符号。例如f(n) = o(g(n)),表示f(n)的复杂度要比g(n)的数量级小,即小于。例如,2n^2 = o(n^3),取n0 ≥ 2/c时,不等式对于所有的n0和c都是成立的。

d、ω符号。例如f(n) = ω(g(n)),表示f(n)的复杂度要比g(n)的数量级大,即大于。

e、Θ符号。例如f(n) = Θ(g(n)),表示f(n)的复杂度既大于等于g(n)的复杂度,又小于等于g(n)的复杂度,即于g(n)的复杂度相当。例如,n^2 + O(n) = Θ(n^2)。但是b中的n^(1/2) = Θ(lgn)却是不成立的,因为n的平方根的确渐近地大于lgn。我们也就不难理解n^2和n^3对于Θ也是不成立的。

2.求解递归式的方法。

一、代换法。

迄今为止还没有一个通用的方法来解递归问题,不幸的是没有一个好的算法来解递归问题。有的时候这个方法有用,有的时候这个方法凑效,如果幸运你自己的方法可以解你遇到的递归,这就有点类似于做积分。但是也跟积分一样一般来说,检查是否得到正确答案是非常容易的。这就是代换法的基本思想。

第一步:Guess the form of the solution。代换法在大多数情况下是有效的,但是不幸的是第一步需是猜答案。你不需要完全猜出来,你可以不需要知道常数系数确切是多少,仅需要猜它的形式。

第二步:通过数学归纳法验证第一步才出来的form是否满足条件。

第三步:也是第二步的必然结果,如果猜对了那么很容易解出常数系数。

例如下图所示是如何利用代换法解一个递归式:

那么,上图中证明了T(n)小于等于一个常数乘以n^3。图中所解出的答案就是上界,不过不是严格的上界,事实上我们认为n的平方也成立。所以这并不能证明递归式的答案就是n^3,这只是表示至多是O(n^3)。

二、递归树法。

递归树法是一种解递归式比较特别的方法,在第一节将归并排序的时候有用到过这个方法。它最棒的一点就是总是能用,它能告诉你一种直觉让你知道答案是多少,只是有些不严谨。所以用这个方法时要特别小心,不然可能会得到错的答案。因为它需要用到点、点、点,使用省略号来得到结论。

三、主定理方法。

主定理方法本质上可以认为是递归树方法的一个应用,但是它更精确。不同于递归树方法有省略号有待证明,主定理方法基于一个定理(主定理)。遗憾的是,主方法限制颇多只能应用到特定的递归式上。

上面的公式是在Word里面打出来后贴图上来的。接下来如下图所示,分别举出了主定理方法的三个应用场景的例子以及一个主定理方法不适用的例子。

关于主定理方法的证明,下面利用递归树方法给出一个简单形象的证明。将主定理方法的递归式画成递归树如下图所示,树的高度为h,每一层效率分析如右边列出所示。其中图中紫色方框中的内容即是叶子节点效率结果的数学推导。

对于CASE 1,整个递归树的权重从根节点到叶节点一直增加,所以整个递归树的权重主要在叶子节点上;

对于CASE 2,(k = 0)递归树每层的权重大致相同,总共h层,所以整个递归树的权重将各层的权重加起来即可;

对于CASE 3,则与CASE 1的情况正好相反,所以整个递归树的权重主要在根节点上。

如上的分析,主定理方法的三种情况的结论便也不难理解。关于主定理方法的详细证明请参见CLRS。

关于Introduction to Algorithms更多的学习资料将继续更新,敬请关注本博客和新浪微博Sheridan

MIT算法导论——第二讲.Solving Recurrence的更多相关文章

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

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

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

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

  3. MIT算法导论笔记

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

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

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

  5. MIT算法导论——第三讲.The Divide-and-Conquer

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

  6. MIT算法导论课程

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

  7. 算法导论 第一章and第二章(python)

    算法导论 第一章 算法     输入--(算法)-->输出   解决的问题     识别DNA(排序,最长公共子序列,) # 确定一部分用法     互联网快速访问索引     电子商务(数值算 ...

  8. 《算法导论》第二章demo代码实现(Java版)

    <算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...

  9. 算法导论学习-Dynamic Programming

    转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...

随机推荐

  1. 前端工程搭建NodeJs+gulp+bower

    需要node.npm的事先安装!! 1.nodejs安装程序会在环境变量中添加两个变量: 系统环境变量中:path 增加C:\Program Files\nodejs\ 因为在该目下存在node.ex ...

  2. 从一个URL下载原始数据,基于byte字节,得到byte数组

    public static byte[] loadRawDataFromURL(String u) throws Exception { URL url = new URL(u); HttpURLCo ...

  3. sql拆分查询

    有这样一个需求: 临时表sql: create table #AA ( ID int, Name nvarchar(20) ) insert #AA select 1,'苏州/上海/温州' union ...

  4. 如何计算IP地址及CIDR(收藏)

    如何计算IP地址及CIDR 一. IP地址概念 IP地址是一个32位的二进制数,它由网络ID和主机ID两部份组成,用来在网络中唯一的标识的一台计算机.网络ID用来标识计算机所处的网段:主 机ID用来标 ...

  5. Windows Phone中的几种集合控件

    前言 Windows Phone开发过程中不可避免的就是和集合数据打交道,如果之前做过WP App的开发的话,相信你已经看过了各种集合控件的使用.扩展和自定义.这些个内容在这篇博客里都没有,那么我们今 ...

  6. IEEE802是一个局域网标准系列

    视频教程 http://v.youku.com/v_show/id_XNjgyODA0NzE2.html?from=s1.8-1-1.2 干线 总线+环形网的传递机制 环形令牌总线 802.4 

  7. [转]adb pull Permission denied及no such file错误

    adb pull  Permission denied及no such file错误 http://www.the8m.com/blog/article/javadk/adbpull.html XP系 ...

  8. JAVA类与对象(三)----类定义关键字详解

    static 表示静态,它可以修饰属性,方法和代码块. 1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这个属性成为本类的类变量,为本类对象所共有.这个属性就是全类 ...

  9. 原生JS实现苹果菜单

    今天分享下用原生JS实现苹果菜单效果,这个效果的重点有以下几点 图标中心点到鼠标的距离的算法 利用比例计算图标的宽度 代码地址:https://github.com/peng666/blogs/blo ...

  10. div均匀分布代码实例

    多个div在同一行以相同间隔分布: 这样的布局效果使用非常的频繁,也就是让多个div在一行分布,并且div于div之间的间隙是一样的,多用在对于产品的展示之用,下面就介绍一下如何实现此中布局,代码实例 ...