课程链接:http://open.163.com/special/opencourse/algorithms.html

第一课:算法分析基础

1.介绍插入排序与归并排序,计算并比较最坏运行时间

2.算法分析重点与渐近分析方法

以下为个人笔记,根据字幕整理


第一课 算法分析
总结 解决问题的方法和方式
算法:关于计算机程序性能和资源利用的研究

算法:性能、速度

在程序设计方面,什么比性能更重要呢?
  正确性,可维护,健壮性
  模块化,安全,用户友好

为什么关注性能?
1.直接决定方法可行不可行
  算法能将不可行变为可行
2.算法是一种描述程序行为的语言
  思考程序的最简洁方式

性能是支付其他东西的“货币”
安全 用户友好 健壮性
    |         | |           |
           性能
衡量代价的一般标准

为什么关注速度?
追求速度是人的天性

、、、、、、、、、、、、、、

排序算法

排序问题的一般描述
输入:序列 a1, a2, a3, ..., an
按需求重新排序
输出:序列 b1, b2, b3, ..., bn

1.插入排序

伪代码描述:
理解算法要描述的意思,简洁
使用缩进表示嵌套

按照升序排列

for j<- 2 to n
  do key<- A[j] //从数组A中取值
  i<- j-1
  while i>0 and A[i]> key //前向查找较大值
    do A[i+1]<- A[i]
    i<- i-1 //i递减至0
  A[i+1]<- key

实例 8 2 4 9 3 6
一次 2 8 4 9 3 6
二次 2 4 8 9 3 6
三次 2 4 8 9 3 6
四次 2 3 4 8 9 6
五次 2 3 4 6 8 9

最坏情况分析
最大占首位,最小占末位

操作数计数:内存引用计数
T(n) = sum _{2->n}( theta(j) )
算术级数 theta(n^2)

小规模n 快速
大规模n 慢
、、、、、、、、、、、、、、、、、、、、、、、、、、

程序分析:
1.运行时间
输入是否有序
输入规模
运行时间上界:对用户的承诺

最关注:
最坏情况分析
T(n) 输入规模为n时的运行时间上界
平均情况分析
T(n) 输入规模为n时,运行时间的期望值

算法的大局观
1.算法涉及诸多领域
2.解决复杂问题

渐近分析
1.忽略依赖于机器的常量
2.关注运行时间的增长,而不是运行时间

相对速度 绝对速度

渐近符号
theta符号函数
theta(n) = 3n^2 + 9n^2 + 5n
去掉常数项、低阶项

数学的严谨,工程的直觉
在两者间找到一种平衡,较好的算法

低速算法
当输入规模在合理范围时,运行速度较快

、、、、、、、、、、、、、、、、、、、、、、、、、、、

归并排序
if n==1 done
else recursively sort
  A[1 ... celi(n/2) ] //ceil向上取整
  A[ celi(n/2)+1 ... n ]
last merge 2 sub sorted list

归并子程序

两个子排序结果:
list[1] 20 13 7 2
list[1] 12 11 9 1

遍历与归并时间
T(n)

递归式
n=1 T(n)=theta(1)
n>1 T(n)=2T(n/2)+theta(n)
-----------------------
如何求解递归式?
-----------------------
递归树
T(n)
T(n/2) T(n/2)
T(n/4) ... T(n/4)
... ...
T(1)  ... ... T(1)

计算量
C(n)
C(n/2) C(n/2)
C(n/4) C(n/4)
... ...
C(1)  ... ... C(1)

高度 log(n)
叶节点数目 n
计算量

cn*log(n) + theta(n)
=theta(n*log(n))

as long as you are rigorous and precise,
you can be as sloppy as you want.
只要你严格而精确,可以略去任意细节

MIT公开课:算法导论 笔记(一)的更多相关文章

  1. MIT算法导论笔记

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

  2. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)

    这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下. 什么时候会发生拷贝构造: 对象之间的初始化赋值 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健 ...

  3. c++子类父类关系(翁恺c++公开课[15-16]学习笔记)

    关于类的继承有三种:public继承.private继承.protected继承 首先说明,关于类的成员变量.函数的权限有三种(public.private.protected) 我们通常会让所有的成 ...

  4. c++模板(翁恺c++公开课[34-35]学习笔记)

    为什么要有模板(templates):当我们需要一个列表(list),列表中元素可能都为X类型也可能都为Y类型,怎么来实现呢? 定义基类?可以实现,很多情况下可能不够简明的表达设计思想 克隆代码(写一 ...

  5. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)

    上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑

  6. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)

    运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...

  7. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)

    static相对来说是一个较复杂的修饰符,c++中的static在c的基础之上又包含了static在类中的应用(也就是说多了static的成员变量和static的成员函数):c\c++中静态变量.对象 ...

  8. 算法导论笔记:18B树

    磁盘作为辅存,它的容量要比内存大得多,但是速度也要慢许多,下面就是磁盘的的结构图: 磁盘驱动器由一个或多个盘片组成,它们以固定的速度绕着主轴旋转,数据存储于盘片的表面,磁盘驱动器通过磁臂末尾的磁头来读 ...

  9. 算法导论笔记——第二十章 van Emde Boas树

    当关键字是有界范围内的整数时,能够规避Ω(lglgn)下界的限制,那么在类似的场景下,我们应弄清楚o(lgn)时间内是否可以完成优先队列的每个操作.在本章中,我们将看到:van Emde Boas树支 ...

随机推荐

  1. Android Weekly Notes Issue #288

    Android Weekly Issue #288 December 17th, 2017 Android Weekly Issue #288 本期内容主要包括介绍Kotlin DSL使用kotlin ...

  2. 干货分享!关于APP导航菜单设计你应该了解的一切

    导航菜单是人机交互的最主要的桥梁和平台,主要作用是不让用户迷失方向.现在市面上产品的菜单栏种类繁多,到底什么样的才是优秀的导航菜单设计呢?好的菜单设计不仅能提升整个产品的用户体验,而且还能让用户耳目一 ...

  3. css弹性盒子新旧兼容

    前言:本篇随笔是对弹性盒子有了解的人来写的这篇文章,具体属性产生的效果这里不做说明,基础的东西去查文档.这里只是总结. 时至今日,css3的flex弹性盒子在移动端基本上都是支持的,但不排除有些些低版 ...

  4. js文件加载优化

    在js引擎部分,我们可以了解到,当渲染引擎解析到script标签时,会将控制权给JS引擎,如果script加载的是外部资源,则需要等待下载完后才能执行. 所以,在这里,我们可以对其进行很多优化工作. ...

  5. Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  6. js浏览器对象navigator

    移动端通常需要判断当前设备的类型,比如安卓,ios等.输出浏览器的请求代理,可以判断浏览器类型.js代码如下 判断当前浏览器的请求代理 我是出来玩的! <!DOCTYPE html> &l ...

  7. java-FFmpeg(一) 实现视频的转码和截图功能

    FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

  8. Linux(CentOS6.5)下编译安装Nginx官方最新稳定版(nginx-1.10.0)

    注:此文已经更新为新版:http://comexchan.cnblogs.com/p/5815753.html ,请直接查看新版,谢谢! 本文地址http://comexchan.cnblogs.co ...

  9. Python3 实现数据读写分离设计

    前言 首先读写分离可以保证数据库的稳定,简单的说就是当网站访问量大时,读写都在一个库,很有可能会出现脏数据的情况,如果采取阻塞似操作,那么用户体验就会变得更差. 而且目前大多数网站的读写是失衡的,以淘 ...

  10. 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现

    基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1.   背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...