本文为麻省理工学院《算法导论》课程第一讲的学习笔记。

网易云课堂上该课程的网站为http://open.163.com/special/opencourse/algorithms.html。

第一部分 算法分析(Analysis of Algorithm)

目录

1. 前言

2. 插入排序(insertion sorting)

3. 分析的种类

4. 插入排序的最差情况是什么?

5. 归并排序(merge sorting)

6. 递归树(Recurrence Tree)--解决递归问题的方法


1. 前言

A course about performance(可行vs不可行)--关于算法与性能的课程。

性能就像获得其他方面提高(准确性、稳定性、用户友好性等)的”货币“。

2. 插入排序(insertion sorting)

排序问题:输入为一个序列{a1, a2, ... ,an},输出一个重新排列后的序列{a1', a2', ... , an'},使其满足某种排列要求。者皆可以插入排序为例进行讲解,后续还会涉及更多排序问题。

插入排序

设置两个循环。外循环j取由1到n,内循环i取由j-1到1;外循环用于依次判断当前的键值key,内循环用于寻找当前key应该插入的位置。【在每一次循环中,已经被排列好的部分(j项之前)保持不变。】

如下图例子(图片来自于百度百科词条“直接插入排序”):

影响插入排序运行时间的因素:

1)输入序列【比如已经拍好的序列运算量最小;逆序排列是最差的情况,需要做最多的运算。】

2)输入序列的大小【越大,越慢】:需要将输入序列的大小参数化(parameterize)。

3. 分析的种类

1)最差的情况:定义T(n)为对于输入大小为n时,运行时间的上限(maximum time,对用户的一种保证)。

2)平均情况:定义T(n)为对于输入大小为n时,运行时间的平均值(expected value,是对于不同n值所对应情况的加权平均,此处需要对不同n值出现的概率做出假设--need assumption for the distribution of input size)。

3)最好的情况--一种“假象”(运行时间的上限才是对用户的保证,而下限不是)

4. 插入排序的最差情况是什么?

衡量的时候我们也需要考虑到计算机--有时我们选择观察相对速度(同一台计算机),这很好理解;有时我们又会观察绝对速度(不同计算机),比如我们想知道某个算法是不是在所有计算机上都有好的表现?

一个非常重要的想法:渐进分析(Asymptotic Analysis)

1)忽略掉那些依赖于计算机的常量

2)不去观测实际运行时间T(n),而是观测运行时间的增长

举个例子:在插入排序中,我们假设每一步运算所耗费的运行时间是一个常数,这就是一种渐进分析。

因此对于插入排序的最差运行时间T(n),我们可以表示为:

其中,theta是一种渐进分析记号,其定义如下[引用1]:

5. 归并排序(merge sorting)

其基本原理如下(图片来自课程视频):

第3步合并(merge)所需的时间=θ(n)。

总的运行时间为(图片来自课程视频):

对于n>1的情况,涉及到了递归(recurrence),如何求解将会在下一部分继续讨论。

6. 递归树(Recurrence Tree)--解决递归问题的方法

T(n)=T(n/2)+c*n,其中c是一个常数。可以表示为以下的树形结构:

最终(上图最右)树的高度是lg(n);叶子(θ(1))的数量为n。

所有叶子的求和为θ(n);除最后一层外,每一层的求和是cn;所以总的和为T(n)=cn*lg(n)+θ(n)=θ(nlg(n))。

因此合并排序的最差运行速度比插入排序的θ(n^2)要快。

引用:

[1] https://blog.csdn.net/wangxiaoan1234/article/details/76030263#theta%E8%AE%B0%E5%8F%B7

网易公开课-MIT麻省理工学院《算法导论》 学习笔记(1)相关推荐

  1. 算法导论中C语言代码,算法导论-学习笔记与进度

    算法导论 阅读进度 第一部分 基础知识 第一章 计算中算法的角色 Done 1.1 算法 输入与输出 算法可以解决哪些问题 数据结构 技术 一些比较难的问题 1.2 作为一种技术的算法 效率 算法和其 ...

  2. 【算法导论学习笔记】第3章:函数的增长

    原创博客,转载请注明: http://www.cnblogs.com/wuwenyan/p/4982713.html  当算法的输入n非常大的时候,对于算法复杂度的分析就显得尤为重要,虽然有时我们能通 ...

  3. 算法导论学习笔记 第7章 快速排序

    对于包含n个数的输入数组来说,快速排序是一种时间复杂度为O(n^2)的排序算法.虽然最环情况的复杂度高,但是快速排序通常是实际应用排序中最好的选择,因为快排的平均性能非常好:它的期望复杂度是O(nlg ...

  4. 算法导论学习笔记 第6章 堆排序

    在本章中介绍了另一种排序算法:堆排序(heapsort).与归排序一样,但不同于插入排序的是,堆排序的时间复杂度式(Onlgn).而与插入排序相同,但不同于归并排序的是,堆排序同样具有空间原址性(我理 ...

  5. 算法导论学习笔记 第2章 算法基础

    本章介绍了一个贯穿本书的框架,后续的算法设计都是在这个框架中进行的. 本章通过插入排序和归并排序两种常见的算法来说明算法的过程及算法分析,在分析插入排序算法时,书中是用了循环不变式证明了算法的正确性, ...

  6. 【转】算法导论学习笔记 一 分治算法

    分治策略是一种常见的算法.在分治策略中,我们递归的求解一个问题,在每层递归中应用如下三个步骤: 1. 分解,将问题分解成规模更小但解决方案相同的子问题 2. 解决,递归的求解子问题,如果子问题足够小则 ...

  7. 算法导论学习笔记1_循环不变式

    循环不变式 1. 循环不变式和数学归纳法 2. 循环不变式的三条性质 3. 利用循环不变式分析插入排序 4. 练习题 2.1.3 1. 循环不变式和数学归纳法 在数学中,数学归纳法常用于证明给定命题在 ...

  8. 算法导论学习笔记 6.5 优先队列

    优先队列(priority queue)是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字(key).一个最大优先队列支持一下操作: INSERT(S, x) ...

  9. 生日悖论问题——《算法导论学习笔记》

    1      生日悖论问题 1.1    原始问题 一个房间里的人数必须达到多少,才能使两个人生日相同的机会达到50%?不考虑闰年情况,也就是一年按照365天来计算. 解答: 假设房间里的人数是k,我 ...

最新文章

  1. 印象笔记电脑版使用技巧_我的印象笔记使用手册(2020)
  2. 《C++覆辙录》——1.9:使用糟糕的语言
  3. Java进阶:AtomicReference详解
  4. (原创)INTERVAL分区表与RANGE分区表相互转化
  5. hashmap(1.8)
  6. 有些图,只要看错一眼就再也回不去了!
  7. airodump-ng wlan0mon扫描不到网络_MySQL ProxySql 由于漏洞扫描导致的 PROXYSQL CPU 超高...
  8. 开源串口 Ymodem 上位机软件
  9. Android WebView:这是一份全面 详细的WebView学习指南
  10. [Ext JS 4] 实战之Grid, Tree Gird 动态添加列
  11. GFW Rule list
  12. httpclient4.x 中文版帮助文档,最新官方版翻译版(第一章 下)
  13. 找到好东西,可以显示最忙碌的java线程的脚本
  14. java spark yarn_java – 是否可以从代码中运行spark yarn cluster?
  15. 手机型号大全_2000-2500元智能手机最全导购推荐(学生党手机必看)-2020年12月更新...
  16. java excel 日期格式转换_Java处理Excel中的日期格式
  17. Python 用均匀分布验证中心极限定理
  18. 读《码农翻身:用故事给技术加点料》
  19. 程序员如何编写高大上且实用的技术文档--转
  20. java计算机毕业设计水果商城源代码+数据库+系统+lw文档

热门文章

  1. 刷题记录-NPUCTF2020(web部分)
  2. DeepMind 最新发文:AlphaZero 的黑箱打开了
  3. 简易集成的MVP模块化App框架(1/3)
  4. linux缓冲区 即 块
  5. 【无标题】基于51单片机和DHT11的温湿度检测系统
  6. 百度地图调用电子围栏API实现案例
  7. diary_mna_2016
  8. 服务器上的文件怎么共享给学生机,云服务器学生机
  9. 工作中使用了一些触发器
  10. 网页屏幕上有只小虫在到处爬(代码)