算法导论第二版
《算法导论第二版》
(ppt)
第一章 绪论
- 1.1 算法的基本特征
- 1.2 算法研究的意义
- 1.3 算法的描述形式
- 1.4 算法分析
- 1.5 增长速率
- 1.6 算法正确性分析
第二章 渐进符号
- 2.1 Θ符号(渐进符号)
- 2.2 Ο符号(渐进上界)
- 2.3 Ω符号(渐进下界)
- 2.4 利用极限比较函数间的增长速度
第三章 分治法及递归算法的分析方法
- 3.1 分治法
- 1. 什么是分治法
- 2. 应用分治法的三个基本步骤
- 3. 归并排序(Merge Sort)
- 4. 归并排序算法分析
- 时间复杂度:最好、最坏、平均都是O(nlgn)
- 空间复杂度:需要两个额外的辅助数组L和R来存放A[p...q]和A[q+1...r],因此空间复杂度为O(n)
- 5. 分治法适用条件
- 3.2 递归算法的分析
- 1. 替换法
- 2. 递归树方法
- 3. Master方法
- 3.3 快速排序算法设计与分析
- 1. 快速排序算法设计
- 2. 快速排序算法分析
- 时间复杂度:最坏O(n2),最好和平均O(nlgn)
- 空间复杂度:由于快排是原地算法,并不用到辅助数组,所以空间复杂度为O(1)
- 3. 平衡划分
- 4. 随机划分的快速排序算法分析
(书+ppt)
第三部分 数据结构
- 第13章 红黑树
- 4.1 二叉查找树性质
- 4.2 红黑树的特性
- 4.3 黑高度(具有n个内部节点的红黑树的高度最多为2lg(n+1))
- 4.4 红黑树的调整操作(变颜色+旋转)
- 4.5 红黑树的插入操作
- 4.6 红黑树的删除操作
- 第14章 数据结构的扩张
- 5.1 动态序统计
- 1. 找第i个最小值操作:O(lgn)
- 2. 求x的序值操作:O(lgn)
- 3. 插入一个节点size域的调整
- 4. 删除一个节点size域的调整
- 5. 插入和删除一个节点的时间:O(lgn)
- 5.2 数据结构扩张的步骤(定理14.1)
- 5.3 区间树
- 1. 挑选红黑树作为基本数据结构
- 2. 确定需增加的信息域
- 3. 核实增加max域后是否可以维持红黑树原有的性能
- 4. 新增区间树的查找操作:时间为O(lgn)
- 定理14.2
- 5.1 动态序统计
第四部分 高级设计和分析技术
- 第15章 动态规划(应用范围非常广,只要问题具有最优子结构性质,就可以用动态规划方法来求解,只不过说在分解后重叠子问题不是很多的情况下,它的优势并不明显)
- 6.1 动态规划方法的基本步骤
- 6.2 装配线调度问题(θ(n))
- 6.3 矩阵链乘(O(n3))
- 6.4 动态规划的要素
- 问题的最优子结构性质(必要条件,若问题没有最优子结构性质,不能用动态规划方法求解)
- 重叠子问题(非必要条件,重叠的子问题越多越有优势)
- 记忆法(备忘录方法)
- 6.5 最长公共子序列问题(θ(mn))
- 6.6 最优二叉查找树(O(n3))
- 第16章 贪心算法
- 7.1 贪心法的基本思想
- 7.2 活动选择问题(很重要,基础)
- 问题的输入
- 活动相容或不冲突
- 活动选择问题
- 动态规划方法
- 贪心法解此问题
- 7.3 贪心法应用注意事项
- 应用贪心法的几项工作
- 贪心选择性质
- 最优子结构性质
- 贪心法与动态规划方法比较
- 7.4 Huffman编码
- 前缀码
- 最优前缀码
- 构造Huffman编码
- 最优前缀码的贪心选择性质和最优子结构性质
- 引理16.2 贪心选择性质
- 引理16.3 最优子结构性质
- 7.5 贪心法的理论基础
- 1. 胚
- 2. 最大独立子集
- 3. 加权胚
- 4. 最优子集
- 5. 加权胚的通用贪心算法
- 加权胚的贪心选择性质
- 加权胚的最优子结构性质
- 6. 一个任务调度问题(胚的应用)
- 第17章 平摊分析
- 8.1 平摊分析方法
- 8.2 合计法
- 8.3 记账法
- 8.4 势能法
- 8.5 动态表
第五部分 高级数据结构
- 第19章 二项堆
- 19.1 二项树与二项堆
- 19.1.1 二项树
- 19.1.2 二项堆
- 19.2 对二项堆的操作
- 19.1 二项树与二项堆
- 第20章 斐波那契堆
- 20.1 斐波那契堆的结构
- 20.2 可合并堆的操作
- 20.3 减小一个关键字与删除一个结点
- 20.4 最大度数的界
第六部分 图算法
- 第26章 最大流
- 26.1 流网络
- 26.2 Ford-Fulkerson方法
- Ford-Fulkerson方法的时间复杂度为:O(E|f*|)
- 一次循环所花费的时间为O(E),|f*|为while循环的次数(不确定),即增广路径的条数。
- Edmonds-Karp算法是真正可用的求解最大流的算法,它的时间复杂度为O(VE2)
- Ford-Fulkerson:O(E|f*|) —> Edmonds-Karp:O(VE2) —> push-relabel:O(V2E) —> relable-to-front:O(V3)。(性能不断提高,因为E>V,边数大于顶点数)
- 26.3 最大二分匹配
- 26.4 Push-relabel algorithms
- 26.5 The relabel-to-front algorithm
课堂上涉及到的各算法的时间复杂度:
1. 插入排序:最好情况:O(n),最坏情况:O(n2),平均情况:O(n2),它的循环不变式为:子数组A[1...j-1]始终为排好序的状态。
2. 二叉查找树:设二叉树的高度为h,则静态操作:查找节点、找前驱、后继等时间为O(h)。动态操作:插入和删除节点等时间为O(h)。均与二叉树的高度有关。
3. 红黑树(一种比较平衡的二叉查找树):红黑树的高度为h=O(lgn)。旋转操作只是几个指针的调整,时间为O(1)。插入操作时间为O(lgn),删除操作时间也为O(lgn)。
4. 活动选择问题:动态规划方法O(n3),贪心法O(nlgn)
5. Huffman编码:O(nlgn)