在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++语言基础 → 《初等算法-刘新宇》pdf

《初等算法-刘新宇》pdf

C/C++语言基础

下载此实例
  • 开发语言:C/C++
  • 实例大小:5.94M
  • 下载次数:23
  • 浏览次数:161
  • 发布时间:2019-11-22
  • 实例类别:C/C++语言基础
  • 发 布 人:liqix
  • 文件格式:.pdf
  • 所需积分:2
 相关标签: pdf 算法

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

⽬ 录
I 前⾔ 11
0.1 算法有⽤么? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
0.2 最⼩可⽤ID,算法的威⼒ . . . . . . . . . . . . . . . . . . . . . . . . 13
0.2.1 改进⼀ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
0.2.2 改进⼆、分⽽治之 . . . . . . . . . . . . . . . . . . . . . . . . 15
0.2.3 简洁与性能――鱼和熊掌 . . . . . . . . . . . . . . . . . . . 16
0.3 丑数――数据结构的威⼒ . . . . . . . . . . . . . . . . . . . . . . . . 17
0.3.1 暴⼒解法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
0.3.2 改进⼀、构造性解法 . . . . . . . . . . . . . . . . . . . . . . 18
0.3.3 改进⼆、使⽤多个队列 . . . . . . . . . . . . . . . . . . . . . 20
0.4 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
0.5 内容组织 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
II 树 25
1 ⼆叉搜索树,数据结构中的‘hello world’ 27
1.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.2 数据组织 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.3 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.4 遍历 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.5 搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.5.1 lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.5.2 最⼩元素和最⼤元素 . . . . . . . . . . . . . . . . . . . . . . 35
1.5.3 前驱(Successor)和后继(predecessor) . . . . . . . . . . 35
1.6 删除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1.7 随机构建⼆叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2 插⼊排序的进化 43
2.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.2 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.3 改进⼀,⼆分查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.4 改进⼆,使⽤链表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.5 使⽤⼆叉搜索树的最终改进 . . . . . . . . . . . . . . . . . . . . . . . 49
2.6 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3
4 ⽬ 录
3 并不复杂的红⿊树 51
3.0.1 如何保证树的平衡 . . . . . . . . . . . . . . . . . . . . . . . . 52
3.0.2 树的旋转 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.1 红⿊树的定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.2 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.3 删除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.4 命令式的红⿊树算法⋆ . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.5 其它 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4 AVL树 71
4.1 AVL树的定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.2 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.2.1 平衡调整 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.2.1.1 左-左偏(Left-left lean)的情况 . . . . . . . . . 77
4.2.1.2 右-右偏(Right-right lean)的情况 . . . . . . . . 77
4.2.1.3 右-左偏(Right-left lean)的情况 . . . . . . . . 77
4.2.1.4 左-右偏(Left-right lean)的情况 . . . . . . . . 79
4.2.2 模式匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.2.2.1 验证 . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.3 删除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.4 AVL树的命令式算法⋆ . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.5 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5 基数树-Trie和Patricia 85
5.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.2 整数Trie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.2.1 整数Trie的定义 . . . . . . . . . . . . . . . . . . . . . . . . . 86
5.2.2 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.2.3 查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.3 整数Patricia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.3.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.3.2 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.3.3 查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.4 字符Trie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.4.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.4.2 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.4.3 查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.5 字符Patricia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.5.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.5.2 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.5.3 查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.6 Trie和Patricia的应⽤ . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.6.1 电⼦词典和单词⾃动补齐 . . . . . . . . . . . . . . . . . . . 108
5.6.2 T9输⼊法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.7 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
⽬ 录 5
6 后缀树 119
6.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.2 后缀Trie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
6.2.1 节点转移和后缀链接 . . . . . . . . . . . . . . . . . . . . . . 120
6.2.2 On-line构造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.3 后缀树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
6.3.1 on-line构造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
6.3.1.1 活动点(active point)和终⽌点(end point) . . 126
6.3.1.2 引⽤对(Reference pair) . . . . . . . . . . . . . . 127
6.3.1.3 归⼀化引⽤对 . . . . . . . . . . . . . . . . . . . . . 127
6.3.1.4 Ukkonen算法 . . . . . . . . . . . . . . . . . . . . . 128
6.3.1.5 函数式构造后缀树 . . . . . . . . . . . . . . . . . . 133
6.4 后缀树的应⽤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
6.4.1 字符串搜索和模式匹配 . . . . . . . . . . . . . . . . . . . . . 135
6.4.1.1 ⼦串出现的次数 . . . . . . . . . . . . . . . . . . . 135
6.4.2 查找最长重复⼦串 . . . . . . . . . . . . . . . . . . . . . . . . 136
6.4.3 查找最长公共⼦串 . . . . . . . . . . . . . . . . . . . . . . . . 138
6.4.4 查找最长回⽂ . . . . . . . . . . . . . . . . . . . . . . . . . . 140
6.4.5 其它 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
6.5 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
7 B树 141
7.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
7.2 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
7.2.1 分拆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
7.2.1.1 插⼊前预分拆 . . . . . . . . . . . . . . . . . . . . . 144
7.2.1.2 先插⼊再修复 . . . . . . . . . . . . . . . . . . . . . 147
7.3 删除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.3.1 删除前预合并 . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.3.2 先删除再修复 . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.4 搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
7.5 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
III 堆 165
8 ⼆叉堆 167
8.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
8.2 ⽤数组实现隐式⼆叉堆 . . . . . . . . . . . . . . . . . . . . . . . . . 167
8.2.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
8.2.2 Heapify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
8.2.3 构造堆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
8.2.4 堆的基本操作 . . . . . . . . . . . . . . . . . . . . . . . . . . 171
8.2.4.1 获取顶部元素 . . . . . . . . . . . . . . . . . . . . . 171
8.2.4.2 弹出堆顶元素 . . . . . . . . . . . . . . . . . . . . . 173
8.2.4.3 寻找top k个元素 . . . . . . . . . . . . . . . . . . . 173
8.2.4.4 减⼩key值 . . . . . . . . . . . . . . . . . . . . . . . 174
8.2.4.5 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . 175
8.2.5 堆排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
8.3 左偏堆和skew堆―显式的⼆叉堆 . . . . . . . . . . . . . . . . . . . . 177
6 ⽬ 录
8.3.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
8.3.1.1 Rank(S-值) . . . . . . . . . . . . . . . . . . . . . 178
8.3.1.2 左偏性质 . . . . . . . . . . . . . . . . . . . . . . . 178
8.3.2 合并 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
8.3.2.1 合并由数组表⽰的⼆叉堆 . . . . . . . . . . . . . . 179
8.3.3 基本堆操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
8.3.3.1 获取顶部元素和弹出操作 . . . . . . . . . . . . . . 180
8.3.3.2 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . 180
8.3.4 使⽤左偏堆实现堆排序 . . . . . . . . . . . . . . . . . . . . . 181
8.3.5 Skew堆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
8.3.5.1 Skew堆的定义 . . . . . . . . . . . . . . . . . . . . . 181
8.3.5.2 合并 . . . . . . . . . . . . . . . . . . . . . . . . . . 182
8.4 伸展堆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
8.4.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
8.4.1.1 伸展操作 . . . . . . . . . . . . . . . . . . . . . . . 183
8.4.1.2 获取和弹出顶部元素 . . . . . . . . . . . . . . . . . 188
8.4.1.3 合并 . . . . . . . . . . . . . . . . . . . . . . . . . . 188
8.4.2 堆排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
8.5 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
9 从吃葡萄到世界杯,选择排序的进化 191
9.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
9.2 查找最⼩元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
9.2.1 标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
9.2.2 分组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
9.2.3 选择排序的性能 . . . . . . . . . . . . . . . . . . . . . . . . . 196
9.3 细微改进 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
9.3.1 ⽐较⽅法参数化 . . . . . . . . . . . . . . . . . . . . . . . . . 196
9.3.2 细微调整 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
9.3.3 鸡尾酒排序(Cock-tail sort) . . . . . . . . . . . . . . . . . 198
9.4 本质改进 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
9.4.1 锦标赛淘汰法 . . . . . . . . . . . . . . . . . . . . . . . . . . 201
9.4.1.1 锦标赛淘汰法的细节改进 . . . . . . . . . . . . . . 206
9.4.2 使⽤堆排序进⾏最后的改进 . . . . . . . . . . . . . . . . . . 208
9.5 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
10 ⼆项式堆,斐波那契堆和配对堆 211
10.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
10.2 ⼆项式堆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
10.2.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
10.2.1.1 ⼆项式树 . . . . . . . . . . . . . . . . . . . . . . . 211
10.2.1.2 ⼆项式堆 . . . . . . . . . . . . . . . . . . . . . . . 212
10.2.1.3 数据布局 . . . . . . . . . . . . . . . . . . . . . . . 214
10.2.2 基本的堆操作 . . . . . . . . . . . . . . . . . . . . . . . . . . 215
10.2.2.1 树的链接 . . . . . . . . . . . . . . . . . . . . . . . 215
10.2.2.2 插⼊新元素(push) . . . . . . . . . . . . . . . . . 217
10.2.2.3 堆合并 . . . . . . . . . . . . . . . . . . . . . . . . . 219
10.2.2.4 弹出 . . . . . . . . . . . . . . . . . . . . . . . . . . 222
10.2.2.5 其他 . . . . . . . . . . . . . . . . . . . . . . . . . . 224
10.3 斐波那契堆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
⽬ 录 7
10.3.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
10.3.2 基本堆操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
10.3.2.1 插⼊新元素 . . . . . . . . . . . . . . . . . . . . . . 226
10.3.2.2 堆合并 . . . . . . . . . . . . . . . . . . . . . . . . . 227
10.3.2.3 弹出(删除最⼩元素) . . . . . . . . . . . . . . . 228
10.3.3 弹出操作的性能分析 . . . . . . . . . . . . . . . . . . . . . . 232
10.3.4 减⼩key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
10.3.5 斐波那契堆名字的由来 . . . . . . . . . . . . . . . . . . . . . 237
10.4 配对堆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
10.4.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
10.4.2 基本堆操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
10.4.2.1 合并、插⼊、和获取顶部元素 . . . . . . . . . . . 240
10.4.2.2 减⼩节点的值 . . . . . . . . . . . . . . . . . . . . . 241
10.4.2.3 弹出 . . . . . . . . . . . . . . . . . . . . . . . . . . 242
10.4.2.4 删除节点 . . . . . . . . . . . . . . . . . . . . . . . 245
10.5 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
IV 队列和序列 247
11 并不简单的队列 249
11.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
11.2 单向列表和循环缓冲区实现的队列 . . . . . . . . . . . . . . . . . . 249
11.2.1 单向链表实现 . . . . . . . . . . . . . . . . . . . . . . . . . . 249
11.2.2 循环缓冲区实现 . . . . . . . . . . . . . . . . . . . . . . . . . 251
11.3 纯函数式实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
11.3.1 双列表队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
11.3.2 双数组队列——⼀种对称实现 . . . . . . . . . . . . . . . . . 257
11.4 ⼩改进:平衡队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
11.5 进⼀步改进:实时队列 . . . . . . . . . . . . . . . . . . . . . . . . . 260
11.5.0.1 逐步反转 . . . . . . . . . . . . . . . . . . . . . . . 261
11.5.0.2 逐步连接 . . . . . . . . . . . . . . . . . . . . . . . 262
11.5.0.3 汇总 . . . . . . . . . . . . . . . . . . . . . . . . . . 263
11.6 惰性实时队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
11.7 ⼩节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
12 序列,最后⼀块砖 271
12.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
12.2 ⼆叉随机访问列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
12.2.1 普通数组和列表 . . . . . . . . . . . . . . . . . . . . . . . . . 272
12.2.2 使⽤森林表⽰序列 . . . . . . . . . . . . . . . . . . . . . . . . 272
12.2.3 在序列的头部插⼊ . . . . . . . . . . . . . . . . . . . . . . . . 273
12.2.3.1 从序列头部删除元素 . . . . . . . . . . . . . . . . . 275
12.2.3.2 随机访问元素 . . . . . . . . . . . . . . . . . . . . . 276
12.3 ⼆叉随机访问列表的数字表⽰(Numeric representation) . . . . . 279
12.3.1 命令式⼆叉随机访问列表 . . . . . . . . . . . . . . . . . . . 281
12.4 命令式双数组列表(paired-array list) . . . . . . . . . . . . . . . . 284
12.4.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
12.4.2 插⼊和添加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
12.4.3 随机访问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
8 ⽬ 录
12.4.4 删除和平衡 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
12.5 可连接列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
12.6 ⼿指树(Finger Tree) . . . . . . . . . . . . . . . . . . . . . . . . . . 290
12.6.1 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
12.6.2 向序列的头部插⼊元素 . . . . . . . . . . . . . . . . . . . . . 293
12.6.3 从头部删除元素 . . . . . . . . . . . . . . . . . . . . . . . . . 295
12.6.4 删除时处理不规则的⼿指树 . . . . . . . . . . . . . . . . . . 296
12.6.5 在序列的尾部添加元素 . . . . . . . . . . . . . . . . . . . . . 301
12.6.6 从尾部删除元素 . . . . . . . . . . . . . . . . . . . . . . . . . 302
12.6.7 连接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
12.6.8 ⼿指树的随机访问 . . . . . . . . . . . . . . . . . . . . . . . . 308
12.6.8.1 增加size记录 . . . . . . . . . . . . . . . . . . . . . 308
12.6.8.2 增加size信息后引⼊的改动 . . . . . . . . . . . . . 310
12.6.8.3 在指定位置分割⼿指树 . . . . . . . . . . . . . . . 312
12.6.8.4 随机访问 . . . . . . . . . . . . . . . . . . . . . . . 313
12.6.8.5 命令式随机访问 . . . . . . . . . . . . . . . . . . . 314
12.6.8.6 命令式分割 . . . . . . . . . . . . . . . . . . . . . . 316
12.7 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
V 排序和搜索 321
13 分⽽治之,快速排序和归并排序 323
13.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
13.2 快速排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
13.2.1 基本形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
13.2.2 严格弱序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
13.2.3 划分(partition) . . . . . . . . . . . . . . . . . . . . . . . . 325
13.2.4 函数式划分算法的⼩改进 . . . . . . . . . . . . . . . . . . . 328
13.2.4.1 累积划分(Accumulated partition) . . . . . . . . 329
13.2.4.2 累积式快速排序 . . . . . . . . . . . . . . . . . . . 329
13.3 快速排序的性能分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
13.3.1 平均情况的分析 ⋆ . . . . . . . . . . . . . . . . . . . . . . . . 331
13.4 ⼯程实践中的改进 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
13.4.1 处理重复元素的⼯程⽅法 . . . . . . . . . . . . . . . . . . . 334
13.4.1.1 双向划分(2-way partition) . . . . . . . . . . . . 335
13.4.1.2 三路划分 . . . . . . . . . . . . . . . . . . . . . . . 337
13.5 针对最差情况的⼯程实践 . . . . . . . . . . . . . . . . . . . . . . . . 340
13.6 其他⼯程实践 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
13.7 其他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
13.8 归并排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
13.8.1 基本归并排序 . . . . . . . . . . . . . . . . . . . . . . . . . . 345
13.8.1.1 归并 . . . . . . . . . . . . . . . . . . . . . . . . . . 345
13.8.1.2 性能 . . . . . . . . . . . . . . . . . . . . . . . . . . 348
13.8.1.3 细微改进 . . . . . . . . . . . . . . . . . . . . . . . 348
13.9 原地归并排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
13.9.1 死板的原地归并 . . . . . . . . . . . . . . . . . . . . . . . . . 352
13.9.2 原地⼯作区 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
13.9.3 原地归并排序vs.链表归并排序 . . . . . . . . . . . . . . . . . 357
13.10 ⾃然归并排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
⽬ 录 9
13.11 ⾃底向上归并排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
13.12 并⾏处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
13.13 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
14 搜索 369
14.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
14.2 序列搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
14.2.1 分⽽治之的搜索 . . . . . . . . . . . . . . . . . . . . . . . . . 369
14.2.1.1 k选择问题 . . . . . . . . . . . . . . . . . . . . . . . 369
14.2.1.2 ⼆分查找 . . . . . . . . . . . . . . . . . . . . . . . 373
14.2.1.3 ⼆维搜索 . . . . . . . . . . . . . . . . . . . . . . . 376
14.2.1.3.1 穷举法⼆维搜索 . . . . . . . . . . . . . . 377
14.2.1.3.2 Saddleback搜索 . . . . . . . . . . . . . . 377
14.2.1.3.3 改进的saddleback搜索 . . . . . . . . . . 380
14.2.1.3.4 Saddleback搜索的进⼀步改进 . . . . . . 382
14.2.2 信息复⽤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
14.2.2.1 Boyer-Moore众数问题 . . . . . . . . . . . . . . . . 388
14.2.2.2 最⼤⼦序列和 . . . . . . . . . . . . . . . . . . . . . 392
14.2.2.3 KMP . . . . . . . . . . . . . . . . . . . . . . . . . . 393
14.2.2.3.1 纯函数式KMP算法 . . . . . . . . . . . . 397
14.2.2.4 Boyer-Moore字符串匹配算法 . . . . . . . . . . . . 404
14.2.2.4.1 不良字符(bad-character)启发条件 . . 405
14.2.2.4.2 良好后缀启发条件 . . . . . . . . . . . . . 407
14.3 解的搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
14.3.1 深度优先搜索(DFS)和⼴度优先搜索(BFS) . . . . . . 413
14.3.1.1 迷宫 . . . . . . . . . . . . . . . . . . . . . . . . . . 413
14.3.1.2 ⼋皇后问题 . . . . . . . . . . . . . . . . . . . . . . 418
14.3.1.3 跳棋趣题 . . . . . . . . . . . . . . . . . . . . . . . 421
14.3.1.4 深度优先搜索的⼩结 . . . . . . . . . . . . . . . . . 425
14.3.1.5 狼、⽺、⽩菜趣题 . . . . . . . . . . . . . . . . . . 426
14.3.1.6 倒⽔问题 . . . . . . . . . . . . . . . . . . . . . . . 431
14.3.1.7 华容道 . . . . . . . . . . . . . . . . . . . . . . . . . 439
14.3.1.8 ⼴度优先搜索的⼩结 . . . . . . . . . . . . . . . . . 445
14.3.2 搜索最优解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
14.3.2.1 贪⼼算法 . . . . . . . . . . . . . . . . . . . . . . . 447
14.3.2.1.1 Huffman编码 . . . . . . . . . . . . . . . . 447
14.3.2.1.2 换零钱问题 . . . . . . . . . . . . . . . . . 456
14.3.2.1.3 贪⼼⽅法的⼩结 . . . . . . . . . . . . . . 457
14.3.2.2 动态规划 . . . . . . . . . . . . . . . . . . . . . . . 458
14.3.2.2.1 动态规划的性质 . . . . . . . . . . . . . . 463
14.3.2.2.2 最长公共⼦序列问题 . . . . . . . . . . . 463
14.3.2.2.3 ⼦集和问题 . . . . . . . . . . . . . . . . . 467
14.4 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
VI 附录 475
Appendices
10 ⽬ 录
A 列表 477
A.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
A.2 列表的定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
A.2.1 空列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
A.2.2 获取元素和⼦列表 . . . . . . . . . . . . . . . . . . . . . . . . 478
A.3 列表的基本操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
A.3.1 构建 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
A.3.2 判空和长度计算 . . . . . . . . . . . . . . . . . . . . . . . . . 479
A.3.3 索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
A.3.4 获取最后的元素 . . . . . . . . . . . . . . . . . . . . . . . . . 481
A.3.5 反向索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
A.3.6 修改 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
A.3.6.1 添加(Append) . . . . . . . . . . . . . . . . . . . 485
A.3.6.2 修改指定位置上的元素 . . . . . . . . . . . . . . . 486
A.3.6.3 插⼊ . . . . . . . . . . . . . . . . . . . . . . . . . . 487
A.3.6.4 删除 . . . . . . . . . . . . . . . . . . . . . . . . . . 490
A.3.6.5 连接 . . . . . . . . . . . . . . . . . . . . . . . . . . 492
A.3.7 和与积 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
A.3.7.1 递归求和与求积 . . . . . . . . . . . . . . . . . . . 493
A.3.7.2 尾递归 . . . . . . . . . . . . . . . . . . . . . . . . . 494
A.3.7.3 命令式的求和与求积 . . . . . . . . . . . . . . . . . 497
A.3.8 最⼤值和最⼩值 . . . . . . . . . . . . . . . . . . . . . . . . . 497
A.4 变换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
A.4.1 映射(map)和for-each . . . . . . . . . . . . . . . . . . . . . 500
A.4.1.1 映射 . . . . . . . . . . . . . . . . . . . . . . . . . . 501
A.4.1.2 For each . . . . . . . . . . . . . . . . . . . . . . . . 503
A.4.1.3 映射的例⼦ . . . . . . . . . . . . . . . . . . . . . . 504
A.4.2 反转 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
A.5 提取⼦列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
A.5.1 截取(take)、丢弃(drop)、和分割(split-at) . . . . . 508
A.5.1.1 take-while和drop-while . . . . . . . . . . . . . . . . 509
A.5.1.2 split-at . . . . . . . . . . . . . . . . . . . . . . . . . 509
A.5.2 切分和分组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
A.5.2.1 切分 . . . . . . . . . . . . . . . . . . . . . . . . . . 509
A.5.2.2 分组 . . . . . . . . . . . . . . . . . . . . . . . . . . 510
A.6 Fold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
A.6.1 从右侧fold . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
A.6.2 从左侧fold . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
A.6.2.1 命令式fold和抽象fold概念 . . . . . . . . . . . . . 517
A.6.3 fold的应⽤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
A.6.3.1 连接列表的列表 . . . . . . . . . . . . . . . . . . . 519
A.7 搜索和匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
A.7.1 存在检查 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
A.7.2 lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
A.7.3 ゙nd和゙lter . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
A.7.4 匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
A.8 zip和unzip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
A.9 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527

标签: pdf 算法

实例下载地址

《初等算法-刘新宇》pdf

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警