6 序列与集合的演算法
PART A
介绍
本章要介绍的演算法
◎ 搜寻与排序
◎ 资料压缩
◎ 序列的相似度
6.2 二元搜寻
二元搜寻 Binary Search
搜寻问题
令 x1, x2,…, xn 是一个数列,其中关系为 x1≤x2≤… ≤xn (排序完成)
希望找出 z 是否出现在此序列中,如果存在的话,指出是哪个 xi
线性搜寻
3 8 15 20 22 37 55 98
为一序列,n = 8
想找序列中有没有 37
线性搜寻
时间复杂度: O(n) 看 "比较" 次数
3
8
15
20
22
37
二元搜寻
3 8 15 20 22 37 55 98
想找序列中有没有 37
每次都和中点比较,来决定位置
1. 22 < 37 37 在 37 ~ 98 之间
2. 37 < 55 37 在 37 ~ 37 之间
3. 找到 37
二元搜寻
时间复杂度: O(log2n)
37
↑ 数量 / 2
37 55 98
↑ 数量 / 2
3 8 15 20 22 37 55 98
二元搜寻
n
n/2
2
1
约
log2n
层
层数即为比较的次数,
因此二元运算的复杂度为
O(log2n)
环状序列的二元搜寻
3
8
15
20
22
37
55
98
起点
问题:要找最小的值
6.3 内插搜寻
考虑找书页的问题:整本书有 800页,我要找 202 页
二元搜寻法
1~400 201~400 201~300
201~250 201~225 201~213
201~207 201~204 201~202
需要花 9 次才能找到,能改进吗
内插搜寻
内插搜寻的观念是,如果目前的点和要找的数字距离很近时,应该在附近继续搜寻较为合理
800 页中找 202 页
翻 1/4 处左右,假设翻到 250 页
202 大约是 250 的 80%,因此我们 翻 4/5 处左右
依此类推
内插搜寻
以上的例子就是内插搜寻的主要精神
内插搜寻演算法:
z
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
内插搜寻
复杂度
内插搜寻的效能取决於输入的内容
对均匀分布的输入相当有效率
比较次数为 O(log logn)
似乎比二元搜寻法好很多,但是由於实行上 log 再取 log 不会下降多少,并且内插法需要许多复杂运算
6.4 排序
排序问题:给定 n 个数,将它们由小到大排列
排序前:x1, x2, …, xn
排序后:xi1, xi2, …, xin
且 xi1≤ xi2 ≤ … ≤ xin
6.4.1 桶排序与基数排序
或许最简单的排序技巧是:准备足够的「桶子」,然后把数字放到对应的桶子
这个方法叫「桶排序」 (bucket sort)
1
2
3
4
5
96
97
98
99
100
…
5
98
2
桶排序
上面的桶排序相当有效率,时间复杂度为 O(n)
但是,如果数字的范围相当大,就会需要很大量的「桶子」 (空间复杂度大)
例如要装下五位数的邮递区号,你就需要 100,000 个左右的「桶子」
桶排序只适合在元素范围较小,而且范围已知的状况
桶排序
假设有 n 个整数要排序,每个整数的范围从 1 到 m
所以我们要配置 m 个桶子
并将这 n 个数都放进正确号码的桶子 O(n)
再按照桶子的顺序收集这些元素 O(m)
因此,时间复杂度为 O(m+n)
桶排序
如果 m = O(n),那麼 O(m+n) = O(n)
如果 m 比 n 大非常多 (例如邮递区号),时间复杂度就会很大
桶排序还需要 O(m) 的储存空间,这也是很大的问题
泡泡排序法 (补充)
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
泡泡排序法 (补充)
复杂度
每一个数字最多的比较与交换次数:n
因此时间复杂度为 O(n2)
6.4.2 插入排序与选择排序
插入排序 (insertion sort)
根据归纳法的概念而设计,如果 n-1 个数字已经排序完成,第 n 个数字只须要再选择它的位置插进去
26 35 47 66
n-1 个数
39 (第n个数)
插入排序
复杂度
每一个数字,要搜寻它的正确位置,因此复杂度为 n * O(logn) = O(n logn)
插入搜寻还可能有大量的搬动,每次插入最多可能搬动 n 个数字,因此搬动的复杂度为 O(n2)
26 35 47 66
n-1 个数
39 (第n个数)
搜寻
二元搜寻法的复杂度
PART A
介绍
本章要介绍的演算法
◎ 搜寻与排序
◎ 资料压缩
◎ 序列的相似度
6.2 二元搜寻
二元搜寻 Binary Search
搜寻问题
令 x1, x2,…, xn 是一个数列,其中关系为 x1≤x2≤… ≤xn (排序完成)
希望找出 z 是否出现在此序列中,如果存在的话,指出是哪个 xi
线性搜寻
3 8 15 20 22 37 55 98
为一序列,n = 8
想找序列中有没有 37
线性搜寻
时间复杂度: O(n) 看 "比较" 次数
3
8
15
20
22
37
二元搜寻
3 8 15 20 22 37 55 98
想找序列中有没有 37
每次都和中点比较,来决定位置
1. 22 < 37 37 在 37 ~ 98 之间
2. 37 < 55 37 在 37 ~ 37 之间
3. 找到 37
二元搜寻
时间复杂度: O(log2n)
37
↑ 数量 / 2
37 55 98
↑ 数量 / 2
3 8 15 20 22 37 55 98
二元搜寻
n
n/2
2
1
约
log2n
层
层数即为比较的次数,
因此二元运算的复杂度为
O(log2n)
环状序列的二元搜寻
3
8
15
20
22
37
55
98
起点
问题:要找最小的值
6.3 内插搜寻
考虑找书页的问题:整本书有 800页,我要找 202 页
二元搜寻法
1~400 201~400 201~300
201~250 201~225 201~213
201~207 201~204 201~202
需要花 9 次才能找到,能改进吗
内插搜寻
内插搜寻的观念是,如果目前的点和要找的数字距离很近时,应该在附近继续搜寻较为合理
800 页中找 202 页
翻 1/4 处左右,假设翻到 250 页
202 大约是 250 的 80%,因此我们 翻 4/5 处左右
依此类推
内插搜寻
以上的例子就是内插搜寻的主要精神
内插搜寻演算法:
z
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
内插搜寻
复杂度
内插搜寻的效能取决於输入的内容
对均匀分布的输入相当有效率
比较次数为 O(log logn)
似乎比二元搜寻法好很多,但是由於实行上 log 再取 log 不会下降多少,并且内插法需要许多复杂运算
6.4 排序
排序问题:给定 n 个数,将它们由小到大排列
排序前:x1, x2, …, xn
排序后:xi1, xi2, …, xin
且 xi1≤ xi2 ≤ … ≤ xin
6.4.1 桶排序与基数排序
或许最简单的排序技巧是:准备足够的「桶子」,然后把数字放到对应的桶子
这个方法叫「桶排序」 (bucket sort)
1
2
3
4
5
96
97
98
99
100
…
5
98
2
桶排序
上面的桶排序相当有效率,时间复杂度为 O(n)
但是,如果数字的范围相当大,就会需要很大量的「桶子」 (空间复杂度大)
例如要装下五位数的邮递区号,你就需要 100,000 个左右的「桶子」
桶排序只适合在元素范围较小,而且范围已知的状况
桶排序
假设有 n 个整数要排序,每个整数的范围从 1 到 m
所以我们要配置 m 个桶子
并将这 n 个数都放进正确号码的桶子 O(n)
再按照桶子的顺序收集这些元素 O(m)
因此,时间复杂度为 O(m+n)
桶排序
如果 m = O(n),那麼 O(m+n) = O(n)
如果 m 比 n 大非常多 (例如邮递区号),时间复杂度就会很大
桶排序还需要 O(m) 的储存空间,这也是很大的问题
泡泡排序法 (补充)
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
3
8
15
20
22
37
泡泡排序法 (补充)
复杂度
每一个数字最多的比较与交换次数:n
因此时间复杂度为 O(n2)
6.4.2 插入排序与选择排序
插入排序 (insertion sort)
根据归纳法的概念而设计,如果 n-1 个数字已经排序完成,第 n 个数字只须要再选择它的位置插进去
26 35 47 66
n-1 个数
39 (第n个数)
插入排序
复杂度
每一个数字,要搜寻它的正确位置,因此复杂度为 n * O(logn) = O(n logn)
插入搜寻还可能有大量的搬动,每次插入最多可能搬动 n 个数字,因此搬动的复杂度为 O(n2)
26 35 47 66
n-1 个数
39 (第n个数)
搜寻
二元搜寻法的复杂度
·上一篇:物质的状态及其变化中考新题归类评析
·下一篇:如何修改后处理使数控程序头中包含程序的名字

文件类型:PPT/Microsoft Powerpoint 文件大小:字节