MIT公开课:算法导论 笔记(一)

课程链接: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.
只要你严格而精确,可以略去任意细节

时间: 2024-08-10 06:13:33

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

MIT公开课: Python 笔记7 列表及可变性,字典,效率

Lecture 7: Lists and mutability,dictionaries,pseudocode,introduction to efficiency 列表及可变性,字典,伪代码,效率 Lists and mutability 列表及可变性 >>> L1 = [1, 2, 3] >>> L2 = L1 >>> print L2 [1, 2, 3] >>> L1[0] = 4 >>> print L2 [

MIT公开课: Python 笔记6 二分法,牛顿-拉夫森方法,列表

Lecture5: Bisection methods , Newton/Raphson, introduction to lists二分法,牛顿,拉复生方法,列表 Bisection methods 二分法 注意: # bug: when x < 1, sqrt(x) > x = high eg.x=0.25 sqrt(x) = 0.5 # fix bug: high = max(x, 1.0) def squareRootBi(x, epsilon): """

MIT算法导论笔记

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

普林斯顿公开课 算法1-10:并查集-优化的快速合并方法

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

普林斯顿公开课 算法1-11:并查集的应用

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

普林斯顿公开课 算法2-1:排序概述

目标 对所有类型的数据进行排序. 问题 排序函数如何知道比较的是哪种类型的数据呢? 回调函数 这时候就需要引入回调函数的概念了.回调函数就是将可执行的代码作为参数进行传递. 实现回调的方法 在Java中可以通过接口来实现,在C语言中可以通过函数指针来实现,C++中可以通过class-type functor,也就是重载操作符operator ()的类,在C#中可以使用Delegate委托,在Python/Perl/ML/javascript中可以直接传递函数. JDK中提供了Comparable

普林斯顿公开课 算法1-1:算法分析

为什么要分析算法 分析算法能够预測算法的性能,比較算法之间的优劣,保证算法的正确性,理解算法的理论基础. 成功算法的样例 离散傅立叶变换,假设使用暴力方法,那么算法的复杂度是是N^2,假设使用FFT高速傅立叶变换能够实现O(N logN)复杂度 N-body模拟:使用Barnes-hut算法能够将复杂度减少到N logN 顺便发一张N-body模拟的炫图 Barnes-Hut算法示意图 算法分析的步骤 观察问题的特征和想到得到的结果 依据观察结果提出如果 使用如果来预測可能发生的情况 检測预測结

普林斯顿公开课 算法1-2:观察

这章通过一个简单的例子,详细说明算法分析的步骤. 算法 问题 给定N个不同的整数,从中任意取出三个整数.请问有几种情况,使得取出的3个整数之和为0? 解法 可以使用暴力算法,代码如下: 1 2 3 4 5 6 7 8 9 for(int i=0;i<N;i++){     for(int j=0;j<N;j++){         for(int k=0;k<N;k++){             if(a[i]+b[i]+a[k]==0){                 count+

普林斯顿公开课 算法1-3:数学模型

本节主要通过建立数学模型,来计算算法的运行时间. 公式 算法的运行时间=所有操作的开销乘以操作的次数之和 开销 下表展示了各种操作所需要的时间(单位:纳秒) 整数加法 2.1 整数乘法 2.4 整数除法 5.4 浮点加法 4.6 浮点乘法 4.2 浮点除法 13.5 sin 91.3 arctan 129.0 举例 问题 计算数据中0的个数 代码 1 2 3 4 int count = 0; for (int i= 0; i < N; i++)     if (a[i] == 0)       

普林斯顿公开课 算法1-5:算法理论

本节主要讲解的是算法的复杂度. 算法性能 算法的性能分为三种: 最佳情况:计算时间最短的情况 最差情况:计算时间最长的情况 平均情况:随机输入的期望开销 以二分查找为例 最佳情况是1,因为第一次就有可能找到需要找的整数. 最差情况是logN 平均情况是logN 算法复杂度 算法复杂度用于定义问题的难度,另外也有助于开发最优化的算法,算法复杂度可以通过分析最坏情况来减少输入数据对算法性能的影响. 为了简化问题难度的表示方法,算法复杂度减少了算法分析的细节,忽略常数系数. 最优算法 所谓的最佳算法就