本栏目(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. js----方法是否加括号的问题

    在我们js编写程序的时候,我们会写很多函数然后调用它们,那么这些函数调用的时候什么时候加()什么时候不加()?记住以下几个要点. (1)函数做参数时都不要括号. function fun(e) { a ...

  2. SQLServer数据库表中将指定列分组转一行

    不说明,直接看代码: --1. 创建表,添加测试数据 CREATE TABLE #test(code varchar(50), [values] varchar(10)) INSERT #test S ...

  3. Color About——Second

    下面来简要的说一下Android开发中如何对某一个Activity进行背景色的设置.下面我以名字为FirstActivity的Activity的背景色的设置进行说明,先说一下Drawable类: 关于 ...

  4. self,parent,this区别

    我容易混淆public,private,protected,还容易混淆this,self这些东西.前面已经写了一篇关于public,private,protected博文了,下面来说一下this,se ...

  5. iOS开发网络篇—大文件的多线程断点下载(转)

    http://www.cnblogs.com/wendingding/p/3947550.html   iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了 ...

  6. 实现iOS长时间后台的两种方法:Audiosession和VOIP(转)

    分类: Iphone2013-01-24 14:03 986人阅读 评论(0) 收藏 举报 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在后台下载或者与服务器保持连接的App ...

  7. std::function赋值的几种方法

    定义: #include <functional> std::function<void(const QString&)> myPrintFunction; 函数指针 ...

  8. Windows下将txt导入MySQL及远程连接设置

    1.修改字符编码,全部修改为gbk.这样修改,重启后又会恢复默认值. show variables like '%char%'; set character_set_database=gbk; 其中, ...

  9. Java 执行 SQL 脚本文件

    转自:http://blog.csdn.net/hongmin118/article/details/4588941 package com.unmi.db; import java.io.FileI ...

  10. hadoop历史服务器配置问题

    作者:sdjnzqr 出处:http://www.cnblogs.com/sdjnzqr/ 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者同意,必须保留此段声明:必须在文章中给出原文连接 ...