第1章 绪论 1
1.1 为什么要学习算法 1
1.2 整数乘法 3
1.2.1 问题和解决方案 3
1.2.2 整数乘法问题 3
1.2.3 小学算法 4
1.2.4 操作数量的分析 5
1.2.5 还能做得更好吗 5
1.3 Karatsuba乘法 6
1.3.1 一个具体的例子 6
1.3.2 一种递归算法 7
1.3.3 Karatsuba乘法 9
1.4 MergeSort算法 11
1.4.1 推动力 11
1.4.2 排序 12
1.4.3 一个例子 13
1.4.4 伪码 14
1.4.5 Merge子程序 15
1.5 MergeSort算法分析 16
1.5.1 Merge的运行时间 17
1.5.2 MergeSort的运行时间 18
1.5.3 定理1.2的证明 19
1.5.4 小测验1.1~1.2的答案 23
1.6 算法分析的指导原则 23
1.6.1 第1个原则:最坏情况分析 24
1.6.2 第2个原则:全局分析 25
1.6.3 第3个原则:渐进性分析 26
1.6.4 什么是“快速”算法 27
1.7 本章要点 28
1.8 习题 29
挑战题 31
编程题 31
第2章 渐进性表示法 32
2.1 要旨 32
2.1.1 推动力 32
2.1.2 高级思维 33
2.1.3 4个例子 34
2.1.4 小测验2.1~2.4的答案 38
2.2 大O表示法 40
2.2.1 文本定义 40
2.2.2 图形定义 40
2.2.3 数学定义 41
2.3 两个基本例子 42
2.3.1 k阶多项式是O(nk) 42
2.3.2 k阶多项式不是O(nk-1) 43
2.4 大Ω和大表示法 44
2.4.1 大Ω表示法 44
2.4.2 大表示法 45
2.4.3 小O表示法 46
2.4.4 渐进性表示法的来源 47
2.4.5 小测验2.5的答案 48
2.5 其他例子 48
2.5.1 在指数中添加一个常数 48
2.5.2 指数乘以一个常数 49
2.5.3 最大值vs.和 49
2.6 本章要点 50
2.7 习题 51
第3章 分治算法 53
3.1 分治法规范 53
3.2 以O(n log n)时间计数逆序对 54
3.2.1 问题 54
3.2.2 一个例子 54
3.2.3 协同筛选 55
3.2.4 穷举搜索法 55
3.2.5 分治法 56
3.2.6 高级算法 57
3.2.7 关键思路:站在MergeSort的肩膀上 57
3.2.8 重温Merge 58
3.2.9 Merge和分离逆序对 60
3.2.10 Merge_and_CountSplitInv 61
3.2.11 正确性 61
3.2.12 运行时间 62
3.2.13 小测验3.1~3.2的答案 62
3.3 Strassen的矩阵相乘算法 63
3.3.1 矩阵相乘 63
3.3.2 例子(n = 2) 64
3.3.3 简单算法 64
3.3.4 分治法 65
3.3.5 节省一个递归调用 67
3.3.6 细节 68
3.3.7 小测验3.3的答案 69
*3.4 O(n log n)时间的最近点对(Closest Pair)算法 70
3.4.1 问题 70
3.4.2 热身:1D情况 71
3.4.3 预处理 71
3.4.4 一种分治方法 72
3.4.5 一个微妙的变化 74
3.4.6 ClosestSplitPair 74
3.4.7 正确性 76
3.4.8 辅助结论3.3(a)的证明 77
3.4.9 辅助结论3.3(b)的证明 78
3.4.10 小测验3.4的答案 80
3.5 本章要点 80
3.6 习题 81
挑战题 81
编程题 82
第4章 主方法 83
4.1 重温整数乘法 83
4.1.1 RecIntMult算法 84
4.1.2 Karatsuba算法 84
4.1.3 比较递归过程 85
4.2 形式声明 86
4.2.1 标准递归过程 86
4.2.2 主方法的陈述和讨论 87
4.3 6个例子 88
4.3.1 重温MergeSort 89
4.3.2 二分搜索 89
4.3.3 整数乘法的递归算法 90
4.3.4 Karatsuba乘法 90
4.3.5 矩阵乘法 91
4.3.6 一个虚构的递归过程 92
4.3.7 小测验4.2~4.3的答案 93
*4.4 主方法的证明 94
4.4.1 前言 94
4.4.2 重温递归树 95
4.4.3 单层所完成的工作 96
4.4.4 各层累计 97
4.4.5 正义与邪恶:需要考虑3种情况 98
4.4.6 预告运行时间上界 99
4.4.7 最后的计算:第一种情况 100
4.4.8 迂回之旅:几何级数 101
4.4.9 最后的计算:第二种情况和第三种情况 102
4.4.10 小测验4.4~4.5的答案 103
4.5 本章要点 103
4.6 习题 104
第5章 快速排序(QuickSort) 107
5.1 概述 107
5.1.1 排序 108
5.1.2 根据基准元素进行划分 108
5.1.3 高级描述 110
5.1.4 内容前瞻 110
5.2 围绕基准元素进行划分 111
5.2.1 简易方法 111
5.2.2 原地实现:高级计划 112
5.2.3 例子 113
5.2.4 Partition子程序的伪码 115
5.2.5 QuickSort的伪码 117
5.3 良好的基准元素的重要性 117
5.3.1 ChoosePivot的简单实现 118
5.3.2 ChoosePivot的过度实现 118
5.3.3 小测验5.1~5.2的答案 119
5.4 随机化的QuickSort 121
5.4.1 ChoosePivot的随机化实现 121
5.4.2 随机化QuickSort的运行时间 122
5.4.3 直觉:随机基准元素为什么很好 123
*5.5 随机化QuickSort的分析 124
5.5.1 预备工作 125
5.5.2 分解蓝图 126
5.5.3 应用蓝图 128
5.5.4 计算比较的概率 130
5.5.5 最后的计算 132
5.5.6 小测验5.3的答案 133
*5.6 排序需要 (n log n)的比较 134
5.6.1 基于比较的排序算法 134
5.6.2 具有更强前提的更快速排序 135
5.6.3 定理5.5的证明 136
5.7 本章要点 138
5.8 习题 139
挑战题 140
编程题 141
第6章 线性时间级的选择 142
6.1 RSelect算法 143
6.1.1 选择问题 143
6.1.2 简化为排序 144
6.1.3 分治法 145
6.1.4 RSelect的伪码 146
6.1.5 RSelect的运行时间 147
6.1.6 小测验6.1~6.2的答案 149
*6.2 RSelect的分析 150
6.2.1 根据阶段追踪进展 150
6.2.2 简化为掷硬币 151
6.2.3 综合结论 153
*6.3 DSelect算法 154
6.3.1 基本思路:中位的中位元素 154
6.3.2 DSelect的伪码 155
6.3.3 理解DSelect 156
6.3.4 DSelect的运行时间 157
*6.4 DSelect的分析 159
6.4.1 递归调用之外所完成的工作 159
6.4.2 一个粗略的递归过程 159
6.4.3 30-70辅助结论 160
6.4.4 解析递归过程 163
6.4.5 先猜后验方法 164
6.5 本章要点 166
6.6 本章习题 166
挑战题 167
编程题 168
附录A 快速回顾数学归纳法 169
附录B 快速回顾离散概率 173
· · · · · · (
收起)
评分
☆☆☆☆☆
看视频学算法,so easy!
评分
☆☆☆☆☆
https://b23.tv/av18269909/p1,b站有课程视频
评分
☆☆☆☆☆
看视频学算法,so easy!
评分
☆☆☆☆☆
https://b23.tv/av18269909/p1,b站有课程视频
评分
☆☆☆☆☆
https://b23.tv/av18269909/p1,b站有课程视频
评分
☆☆☆☆☆
原书是这么写的,但是经过反复验证,c=a*a,而不是c=b*b。所以这里应该是作者笔误写错了。 顺便贴一下js的实现: /* * 快速n方计算 * */ function fastPower (a, b) { var c, temp; if (b === 1) { return a; } else { c = b * b; temp = fastPower(c, Math.floor(b/2)) } if (...
评分
☆☆☆☆☆
原书是这么写的,但是经过反复验证,c=a*a,而不是c=b*b。所以这里应该是作者笔误写错了。 顺便贴一下js的实现: /* * 快速n方计算 * */ function fastPower (a, b) { var c, temp; if (b === 1) { return a; } else { c = b * b; temp = fastPower(c, Math.floor(b/2)) } if (...
评分
☆☆☆☆☆
原书是这么写的,但是经过反复验证,c=a*a,而不是c=b*b。所以这里应该是作者笔误写错了。 顺便贴一下js的实现: /* * 快速n方计算 * */ function fastPower (a, b) { var c, temp; if (b === 1) { return a; } else { c = b * b; temp = fastPower(c, Math.floor(b/2)) } if (...
评分
☆☆☆☆☆
原书是这么写的,但是经过反复验证,c=a*a,而不是c=b*b。所以这里应该是作者笔误写错了。 顺便贴一下js的实现: /* * 快速n方计算 * */ function fastPower (a, b) { var c, temp; if (b === 1) { return a; } else { c = b * b; temp = fastPower(c, Math.floor(b/2)) } if (...
评分
☆☆☆☆☆
原书是这么写的,但是经过反复验证,c=a*a,而不是c=b*b。所以这里应该是作者笔误写错了。 顺便贴一下js的实现: /* * 快速n方计算 * */ function fastPower (a, b) { var c, temp; if (b === 1) { return a; } else { c = b * b; temp = fastPower(c, Math.floor(b/2)) } if (...