《算法导论》知识点总结

《算法导论》的学习路线:

1.MIT网易公开课《算法导论》,授课老师也是《算法导论》书的作者之一。讲解的内容几乎围绕书籍,不过其中跳跃表和自组织表书中没有,并行算法和缓存参数无关算法还没看。

2.课程配套的笔记,csdn博客:MIT算法导论公开课之课程笔记,可提前看一遍熟悉一下课程内容,这样看视频有重点。

3.看《算法导论》书籍,主要看了前半部分,其中高级数据结构和算法问题选编还没看。

====================================================================

《算法导论》书籍内容总结:

第一部分 基础知识

1.算法基础
插入排序
思路:从2开始向后循环,判断A[j]是否比前面大,则将其调到合适位置(将前一值赋给后一值,最前那个用最后赋值)。
运行时间:
最坏:无序,theta(n^2)
最好:有序,theta(n)
归并排序
思路:分成两个子数组、分别排序、合并排序
运行时间:T(n)=2T(n/2)+theta(n),递归树求解,T(n)=theta(nlogn)。
分治策略
分解、解决、合并
递归算法:递归情况和基本情况

2.渐进符号
theta():渐进紧确解
O():渐进上界
Omega():渐进下界
o():非渐进上界
w():非渐进下界

3.运行时间函数的递归式求解
代入法;
归纳证明
递归树法
确定树高,所有层次之和
主方法;
T(n)=aT(n/b)+f(n)
case1:若f(n)=O(n^logba),则T(n)=theta(n ^ logba)
case2:若f(n)=theta(n^logba),则T(n)=theta(n ^ logba * logn)
case3:若f(n)=omega(n^logba),则T(n)=theta(f(n))

第二部分 排序算法

4.快速排序
思路:选主元、原址分区、前半部分排序、后半部分排序(分治策略)
性能:取决于分区的平衡度
最坏:(0:n-1),运行时间:T(n)=T(n-1)+T(0)+theta(n),T(n)=theta(n^2)
最好:比例划分,运行时间:T(n)=2T(n/2)+theta(n),T(n)=theta(nlogn)
lucky与unlucky交替:运行时间:theta(n
logn)
改进:随机快速排序
在原有的快速排序基础上,加一个随机选择数i,A[i]与主元交换,然后分区、排序
期望运行时间:theta(n*logn)

5.线性时间排序
决策树
之前的排序均属于比较排序,可以抽象成一颗决策树。
决策树的高度至少为nlogn => 比较排序的运行时间为Omega(nlogn)
而堆排序和归并排序时间上界为n
logn,因而为渐进最优。
计数排序
思路:利用元素个数确定输出位置
前提:n个元素的范围[0,k],若k=O(n),则T(n)=theta(n)。
运行时间:theta(n+k)
基数排序
思路:
最低位计数排序、次地位计数排序、往前推
运行时间:
n个d位数,T(n)=theta(d*(n+k))
n个d位数=>d/r个r位数,T(n)=theta((d/r)*(n+2^r))

6.顺序统计量
问题
n个数中输出第i小的数
随机选择算法
思路:分区、判断第i个数落在哪个区、区内寻找
最坏:T(n)=theta(n^2)
期望时间:E[T(n)]=theta(n),与快速排序的区别在于,快排递归处理两边,而随机选择递归处理其中一边,所以快排的期望时间nlogn,而随机选择的期望时间n。
改进选择算法:
思路:分组/每组5个元素/每组插入排序、对n/5个中位数选择中位数、以此中位数分区、递归选择
运行时间:最坏情况下线性

第三部分 数据结构

7.基本数据结构
栈S
S.top栈顶、压栈操作、出栈操作
队列Q
Q.head队头、Q.tail队尾、入队操作、出队操作
链表L:
L.head表头、L.key关键字、L.next下指针、L.prev上指针
双向链表、单链表、循环链表
搜索、插入、删除

8.散列表
直接寻指表
直接把关键字作为数组下标
散列表:
利用散列函数计算关键字对应的槽位置
若两个关键字映射到同一个槽,发生冲突。
冲突解决:链接法、开放寻址法
链接法解决冲突
把散列到同一槽的所有元素放在一个链表
n个元素m个槽,装载因子a=n/m
在简单均匀散列下,一次成功查找和不成功查找的平均时间theta(1+a)
散列函数
h(k)
每个关键字等可能散列到m槽中,与其他关键字散列情况无关
全域散列
设计一组散列函数H,随机选择其中一个h,以防止恶意设置关键字。
从H中选择一个h,两个关键字发生冲突的概率1/m。
使两个关键字发生冲突的散列函数最多有|H|/m。
开放寻址法
所有元素都放在散列表中,只不过要多次探查。
散列函数:h(k,i)
线性探查、二次探查、双重探查
开放寻址表中,一次不成功的查找,探查次数最多为1/(a-1)
完全散列
两级散列结构,一级散列表存放n个关键字,散列到槽j的所有关键字放在一个二级散列表Sj中而不是链表。
Sj的槽数mj=ni^2,确保不发生冲突。
n个关键字存储在m=n^2的散列表中,表中冲突概率小于1/2。
使用总体存储空间的期望数为O(n)。

9.二叉搜索树
二叉搜索树
以二叉树组织,同时满足x.left.key<=x.key,x.right.key>=x,key。
利用中序遍历算法(输出左子树、中间值、输出右子树),有序输出关键字,运行时间为theta(n)。
查询二叉搜索树
查找:k与x.key比较,决定x=x.left或者x=x.right,while循环直到x=Nil或者k=x.key。
最大值:while循环到x.right=nil
最小值:while循环到x.left=nil
后继:大于x.key的最小关键字的结点,两种情况:右子树存在时右子树最小值;右子树不存在时沿树上升直到遇到一个结点是双亲的左孩子。
前驱:小于x.key的最大关键字的结点
运行时间:均为O(h)。
插入与删除
插入:比较z.key与x.key值,决定x=x.left还是x.right,直到x=nil,修改z和z.p属性。
删除:分情况:一是没有孩子,直接删,修改父节点属性;二是只有一个孩子,删除后孩子提升到原有位置,修改父节点的属性;三是有两个孩子,用后继代替,又分后继是否为其右孩子。
运行时间:均为O(h)。
随机二叉搜索树
随机选取一种排列,插入关键字到一颗初始的空树中而形成的树。
随机二叉树的期望高度:O(lgn)。

10.红黑树
红黑树性质
在二叉搜索树的基础上每个结点增加一个颜色属性,x.color。
1.每个结点是红色或者黑色。
2.根结点和叶结点是黑色。
3.每个红结点的父节点都是黑色。
4.对于每个结点,从该结点到叶结点的路径上,均包含相同数目的黑色结点个数,用黑高表示,bh(x)。
一颗有n个内部结点的红黑树的高度至多为2log(n+1)。
旋转
考虑到插入和删除操作后会红黑树难以维持属性,需要改色和旋转,维护红黑树的性质。
左旋、右旋
插入
在二叉搜索树的插入操作基础上,调用辅助程序对结点改色和旋转。
辅助程序:当父节点为红色时循环操作直到为黑色,分三种情况:case1为叔结点为红色,只要修改父结点和叔结点为黑色,爷结点为红色,指针指向爷结点;case2为结点为右孩子,指针指向父结点,左旋,继续进行第三种处理;case3为结点为左孩子,改父结点和爷结点颜色,指针指向爷结点,右旋。
旋转不会超过两次。
运行时间:O(logn)。

11.数据结构扩张
顺序统计树
1.一颗红黑树,每个结点附加以其为根的子树结点数,x.size=x.left.size+x.right.size+1。
2.一个元素的秩为在中序遍历树时输出的位置。
3.支持的新操作:
查找给定秩的元素:确定x的位置(x.left.size+1),与i比较,决定左子树还是右子树找。
确定一个元素的秩:向上while循环到根节点,更新r,取决于x为右孩子还是左孩子。
4.红黑树的操作能维护size属性,以插入为例,沿插入路径改size属性,时间O(logn),而改色不需要更改size属性,旋转只需要改两个结点的size,所以总时间仍是O(logn)。
如何扩张数据结构
1.选择一种基础数据结构;
2.确定附加信息;
3.检验基础操作能否维护附加信息;
4.设计新操作。
区间树
维护一系列区间数x.int,以x.int.low为次序形成红黑树,每个结点附加x.max属性,表示以x为根结点的子树中端点最大值。
新操作:找出树T中与区间i重叠的结点:当x.left!=nil and x.left.max>=i.low时,x=x.left,否则x=x.right,while循环到x=nil或者i与x,int重叠。

第四部分 高级设计和分析技术

12.动态规划
动态规划与分治法的区别
都是通过组合子问题的解来求解原问题
分治法将问题划分为互不相交的子问题
动态规划应用于子问题重叠的情况
动态规划实现的方法
第一种方法为带备忘的由顶向下法,递归算法,当解决子问题解时首先检查是否保存过此解,如果有直接调用。
第二种方法为由底向上法,将子问题从小至大的顺序求解。
动态规划问题具备的两个要素
最优子结构:原问题的最优解包括其子问题的最优解
子问题重叠:递归算法反复求解相同的子问题
最长公共子序列
求解两个序列中最长的公共子序列,c[i,j]表示X[1,i]与Y[1,j]的最长公共子序列长度
递归解:
c[i,j]=0 (i=0 or j=0)
c[i,j]=c[i-1,j-1]+1 (i,j>0 and xi=yj)
c[i,j]=max(c[i-1,j],c[i,j-1]) (i,j>0 and xi!=yj)
由底向上求解,子问题规模theta(m*n)

13.摊还分析
内容
求数据结构的一个操作序列所执行的所有操作的平均时间
聚合分析
确定一个n个操作的总代价T(n),因为每个操作的平均代价为T(n)/n。
核算法
确定每个操作的摊还代价,超出实际代价时存储,小于实际代价时取出。
要求总的摊还代价大于总的实际代价。
势能法
定义每个数据结构对应的势能函数
确定每个操作的摊还代价,证明总摊还代价大于总实际代价
以表扩张为例研究摊还分析

第五部分 图算法

14.最小生成树
问题描述
已知无向图G(V,E)和权重函数w(u,v),求解一棵树,边权重之和最小。
切割 (S,V-S)是集合V的一个划分
如果一条边(u,v)的一个端点位于集合S,另一个端点位于集合V-S,则边横跨切割。
若集合A不存在横跨切割的边,则该切割尊重集合A。
在横跨切割的所有边中权重最小的边为轻量级边。
定理:T为图G(V,E)的最小生成树,设S为V的一个子集,且有(u,v)为连通S和V-S的最小权值边,那么(u,v)属于T。
Prim算法
这棵树从一个任意根结点r开始,一直长大到覆盖V中的所有结点为止。
算法每一步在连接集合A和A之外的结点的所有边中选择一条轻量级边加入A,贪心算法。
思路:优先队列弹出key最小的点,利用邻接表更新相邻点的key值,以及父结点。
最小生成树:A={(v,v.p),v=V-{r}}

15.单源最短路径
问题描述
已知带权重的有向图G(V,E)和权重函数w(u,v),边权重之和最小的路径为最短路径,找出从结点s到每个结点的最短路径。
u,v之间最短路径定义为delta(u,v)。
边(u,v)的松弛操作:比较v.d和u.d+w(u,v),更新最短路径估计值v.d。
Dijkstra算法
要求所有边的权重为非负值。
算法重复从结点集V-S中选择最短路径估计最小的结点u,将u加入集合S中,然后对所有从u发出的边进行松弛。
算法终止时,对于所有结点u,u.d=delta(s,u)。
Bellman-Ford算法
适用于一般情况。
思路:通过对边进行松弛操作来渐进降低从源结点s到每一个结点v的最短路径估计值v.d,直到该估计值与实际最短路径权重值delta(s,v)相同。
算法对图的每一条边进行|V|-1次处理,每一次对图每条边进行松弛操作。
运行时间:O(VE)。
差分约束系统
线性约束:Ax<=b
在一个差分约束系统中,线性规划矩阵A的每一行包括一个1和一个-1,其他所有项皆为0。
对应的图论:Am*n看做是一张由n个结点和m条边构成的图,每一个结点vi对应n个未知量xi的一个,图中有向边则对应m个不等式的一个。
约束图中包含一个额外的结点v0,用来保证图中至少存在一个结点,从其出发可以到达所有其他结点,其中边w(v0,vi)=0。
如果xj-xi<=bk是一个差分约束条件,则边(vi,vj)的权重w(vi,vj)=bk。
如果G不包含权重为负值的环路,则x=(delta(v0,v1),delta(v0,v2),…delta(v0,vn))是该系统的一个可行解。如果图G包含权重为负值的环路,则该系统没有可行解。

16.所有结点对的最短路径问题
问题描述
对于每对结点u和v,找到结点u到结点v的最短路径。
可以运行|V|次单源最短路径算法来解决所有结点对之间的最短路径问题,每一次使用一个不同的结点作为源结点。
与单源最短路径算法中使用邻接链表表示图不同,本章使用邻接矩阵来表示图。
算法的输入是n阶的W,代表有向图的权重,输出是n阶的D,代表结点间的最短路径权重。
Floyd-Warshall算法
简单路径p=<v1,v2,…vl>上的中间结点指的是除v1和vl之外的任意结点。
考虑到结点i到结点j的所有中间结点均取自于集合{1,2,…k}的路径,设p为其中权重最小的路径。通过分析,可得到递归解:
dij(0)=wij
dij(k)=min(dij(k-1),dik(k-1)+dkj(k-1)) (k!=0)
由底向上计算最短路径权重,计算D(0),D(1),…D(n)。

注意点:
熟悉书中伪码

====================================================================

《算法导论》需要补充的内容

第二部分 排序算法
堆排序
线性时间排序中的桶排序
第四部分 高级设计和分析技术
贪心算法
第五部分 高级数据结构
B树
斐波那契堆
van Emde Boas树
用于不相交集合的数据结构
第七部分 算法问题选编
多线程算法
矩阵运算
线性规划
傅里叶变换
数论算法
NP完全性
近似算法

  • 16
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。 --------------------------------------------------------------- 目录 Introduction to Algorithms, Third Edition 出版者的话 译者序 前言 第一部分 基础知识 第1章 算法在计算中的作用  1.1 算法  1.2 作为一种技术的算法  思考题  本章注记 第2章 算法基础  2.1 插入排序  2.2 分析算法  2.3 设计算法   2.3.1 分治法   2.3.2 分析分治算法  思考题  本章注记 第3章 函数的增长  3.1 渐近记号  3.2 标准记号与常用函数  思考题  本章注记 第4章 分治策略  4.1 最大子数组问题  4.2 矩阵乘法的Strassen算法  4.3 用代入法求解递归式  4.4 用递归树方法求解递归式  4.5 用主方法求解递归式  4.6 证明主定理   4.6.1 对b的幂证明主定理   4.6.2 向下取整和向上取整  思考题  本章注记 第5章 概率分析和随机算法  5.1 雇用问题  5.2 指示器随机变量  5.3 随机算法  ?5.4 概率分析和指示器随机变量的进一步使用   5.4.1 生日悖论   5.4.2 球与箱子   5.4.3 特征序列   5.4.4 在线雇用问题  思考题  本章注记 第二部分 排序和顺序统计量 第6章 堆排序  6.1 堆  6.2 维护堆的性质  6.3 建堆  6.4 堆排序算法  6.5 优先队列  思考题  本章注记 第7章 快速排序  7.1 快速排序的描述  7.2 快速排序的性能  7.3 快速排序的随机化版本  7.4 快速排序分析   7.4.1 最坏情况分析   7.4.2 期望运行时间  思考题  本章注记 第8章 线性时间排序  8.1 排序算法的下界  8.2 计数排序  8.3 基数排序  8.4 桶排序  思考题  本章注记 第9章 中位数和顺序统计量  9.1 最小值和最大值  9.2 期望为线性时间的选择算法  9.3 最坏情况为线性时间的选择算法  思考题  本章注记 第三部分 数据结构 第10章 基本数据结构  10.1 栈和队列  10.2 链表  10.3 指针和对象的实现  10.4 有根树的表示  思考题  本章注记 第11章 散列表  11.1 直接寻址表  11.2 散列表  11.3 散列函数   11.3.1 除法散列法   11.3.2 乘法散列法   11.3.3 全域散列法  11.4 开放寻址法  11.5 完全散列  思考题  本章注记 第12章 二叉搜索树  12.1 什么是二叉搜索树  12.2 查询二叉搜索树  12.3 插入和删除  12.4 随机构建二叉搜索树  思考题  本章注记 第13章 红黑树  13.1 红黑树的性质  13.2 旋转  13.3 插入  13.4 删除  思考题  本章注记 第14章 数据结构的扩张  14.1 动态顺序统计  14.2 如何扩张数据结构  14.3 区间树  思考题  本章注记 第四部分 高级设计和分析技术 第15章 动态规划  15.1 钢条切割  15.2 矩阵链乘法  15.3 动态规划原理  15.4 最长公共子序列  15.5 最优二叉搜索树  思考题  本章注记 第16章 贪心算法  16.1 活动选择问题  16.2 贪心算法原理  16.3 赫夫曼编码  16.4 拟阵和贪心算法  16.5 用拟阵求解任务调度问题  思考题  本章注记 第17章 摊还分析  17.1 聚合分析  17.2 核算法  17.3 势能法  17.4 动态表   17.4.1 表扩张   17.4.2 表扩张和收缩  思考题  本章注记 第五部分 高级数据结构 第18章 B树  18.1 B树的定义  18.2 B树上的基本操作  18.3 从B树中删除关键字  思考题  本章注记 第19章 斐波那契堆  19.1 斐波那契堆结构  19.2 可合并堆操作  19.3 关键字减值和删除一个结点  19.4 最大度数的界  思考题  本章注记 第20章 van Emde Boas树  20.1 基本方法  20.2 递归结构   20.2.1 原型van Emde Boas结构   20.2.2 原型van Emde Boas结构上的操作  20.3 van Emde Boas树及其操作   20.3.1 van Emde Boas树   20.3.2 van Emde Boas树的操作  思考题  本章注记 第21章 用于不相交集合的数据结构  21.1 不相交集合的操作  21.2 不相交集合的链表表示  21.3 不相交集合森林  *21.4 带路径压缩的按秩合并的分析  思考题  本章注记 第六部分 图算法 第22章 基本的图算法  22.1 图的表示  22.2 广度优先搜索  22.3 深度优先搜索  22.4 拓扑排序  22.5 强连通分量  思考题  本章注记 第23章 最小生成树  23.1 最小生成树的形成  23.2 Kruskal算法和Prim算法  思考题  本章注记 第24章 单源最短路径  24.1 Bellman?Ford算法  24.2 有向无环图中的单源最短路径问题  24.3 Dijkstra算法  24.4 差分约束和最短路径  24.5 最短路径性质的证明  思考题  本章注记 第25章 所有结点对的最短路径问题  25.1 最短路径和矩阵乘法  25.2 Floyd?Warshall算法  25.3 用于稀疏图的Johnson算法  思考题  本章注记 第26章 最大流  26.1 流网络  26.2 Ford\Fulkerson方法  26.3 最大二分匹配  26.4 推送重贴标签算法  26.5 前置重贴标签算法  思考题  本章注记 第七部分 算法问题选编 第27章 多线程算法  27.1 动态多线程基础  27.2 多线程矩阵乘法  27.3 多线程归并排序  思考题  本章注记 第28章 矩阵运算  28.1 求解线性方程组  28.2 矩阵求逆  28.3 对称正定矩阵和最小二乘逼近  思考题  本章注记 第29章 线性规划  29.1 标准型和松弛型  29.2 将问题表达为线性规划  29.3 单纯形算法  29.4 对偶性  29.5 初始基本可行解  思考题  本章注记 第30章 多项式与快速傅里叶变换  30.1 多项式的表示  30.2 DFT与FFT  30.3 高效FFT实现  思考题  本章注记 第31章 数论算法  31.1 基础数论概念  31.2 最大公约数  31.3 模运算  31.4 求解模线性方程  31.5 中国余数定理  31.6 元素的幂  31.7 RSA公钥加密系统  31.8 素数的测试  31.9 整数的因子分解  思考题  本章注记 第32章 字符串匹配  32.1 朴素字符串匹配算法  32.2 Rabin\Karp算法  32.3 利用有限自动机进行字符串匹配  32.4 Knuth?Morris?Pratt算法  思考题  本章注记 第33章 计算几何学  33.1 线段的性质  33.2 确定任意一对线段是否相交  33.3 寻找凸包  33.4 寻找最近点对  思考题  本章注记 第34章 NP完全性  34.1 多项式时间  34.2 多项式时间的验证  34.3 NP完全性与可归约性  34.4 NP完全性的证明  34.5 NP完全问题   34.5.1 团问题   34.5.2 顶点覆盖问题   34.5.3 哈密顿回路问题   34.5.4 旅行商问题   34.5.5 子集和问题  思考题  本章注记 第35章 近似算法  35.1 顶点覆盖问题  35.2 旅行商问题  35.2.1 满足三角不等式的旅行商问题  35.2.2 一般旅行商问题  35.3 集合覆盖问题  35.4 随机化和线性规划  35.5 子集和问题  思考题  本章注记 第八部分 附录:数学基础知识 附录A 求和  A.1 求和公式及其性质  A.2 确定求和时间的界  思考题  附录注记 附录B 集合等离散数学内容  B.1 集合  B.2 关系  B.3 函数  B.4 图  B.5 树   B.5.1 自由树   B.5.2 有根树和有序树   B.5.3 二叉树和位置树  思考题  附录注记 附录C 计数与概率  C.1 计数  C.2 概率 C.3 离散随机变量  C.4 几何分布与二项分布  *C.5 二项分布的尾部  思考题  附录注记 附录D 矩阵  D.1 矩阵与矩阵运算  D.2 矩阵基本性质  思考题  附录注记

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值