第6章外部排序-补充

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

R5
R6
R7
R8
R9
R10
第一趟归并 R11 R12 第二趟归并 R21 第三趟归并 R31
R13 R22
R14
R15 R23
2000
4000
8000
R32
10000
第四趟归并
记录有序序列
归并排序过程包括: 一次初始排序 + 四趟归并排序
外排的特点:
(1) 待排序的记录数量很大,不能一次装入内存, 则无法利用上一章讨论的排序方法进行排序 (否则将引起频繁访问内存); (2)数据的读/写以“页块”为单位进行; ( 2) 外排所需时间由三部分组成: 内部初始排序的时间,

矛盾!增大归并路数 k, 使访问外存次数减少。
2. 胜者树和败者树
胜者树——每个非终端结点均表示其左右孩子结点中的
“胜者” (关键字值小者),
15 22 25 32 22 25 15
22 36
22 98 36 47
32
32 15 99
15 25
25 40
40
55
败者树是树型选择排序的一种变型。
第6章 外部排序
一、概述 二、“胜者树”和 “败者 树” 三、多路平衡归并的实现 四、置换-选择排序 五、最佳归并树 六、并行操作的缓冲区处理
1. 外存信息的存取
计算机中进行内外存信息交换的基本单位是 一个字符序列(字符组),对外存言,它是一 个“物理记录” 或“页块”,内存中用来 暂时存放一个页块的区域被称作“缓冲区”。 计算机的 外存储器 磁带 ——顺序存取的设备 磁盘 ——直接存取的设备
1.产生“败者树” 2. 输出当前最小; 3. 调整(从叶到根);
用b0 , b1, b2, b3, b4指示参加 归并的外部结点; 用ls[1, 2, 3, 4, 5]指示内部结点 对应的外部结点;
ls0 1 2 ls1 4 4
输出: 05,10
0 ls2
ls4 3 b0 17 b1 44 17 b4 15 44 21 15 56 归并段0 归并段1
归并段0 :
{17, 21, ∞} 归并段1: {05, 44, ∞} 归并段2: {10, 12, ∞} 归并段3: {29, 32, ∞} 归并段4: {15, 56, ∞}
05 冠军 (最小记录),
输出段1当前记录
15 17
17 17 21
归并段0
选中
10
10 10 12
归并段2
29 29 29 32
归并段3
15 15 56
归并段4
05 05 44
归并段1
1.产生“败者树” 2. 输出当前最小; 3. 调整(从叶到根);
例:关键字序列:{05,10,12,15,17,21,29,32,44,56} 分为5个初始段。 10 亚军(次最小记录), 归并段0 : {17, 21, ∞} 输出段2当前记录 归并段1: {05, 44, ∞} 15 归并段2: {10, 12, ∞} 15 归并段3: {29, 32, ∞} 选中 归并段4: {15, 56, ∞} 44 17 10
输出: 05,
0 ls2
ls4 3 b0 17 b1 05 17 05 b4 15 21 44 15 56 归并段0 归并段1
归并段4
2 ls3
b2 10 10 12
归并段2
b3 29 29 32
归并段3
i
0 1 2 3 4 5 6 7 8 9 ls0 ls1 ls2 ls3 ls4 b0 b1 b2 b3 b4
败者树——每个非终端结点均表示其左右孩子结点中的
“败者” (关键字码大者)。
15
22
22 36 32 32 47
22 15 25
15
40 55 40
22
36
47
32
15
25
40
55
败者树是树型选择排序的一种变型。
败者树——每个非终端结点均表示其左右孩子结点中的
“败者” (关键字码小者)。 “胜者树”和“败者树” 在 调整时的区别: “ 胜者树”—与兄弟比较; “败者树”—与双亲比较 “败者树”中内部结点 与外部结点的关系?
50+50 = 100读/写
100+1004 = 500读/写
除去内部初始排序和逐趟归并时进行的内部归并所需时间 的因素外,外部排序的时间主要取决于逐趟归并所需进行的 “趟数”。如何减少归并趟数?
每一趟将5个或5个以下的子序列归并成一个有序序列。 即:首先从每个(共5个)子序列中各选择一个记录(从第1 个开始),在这5个记录中选择一个最小记录。依次类推。
1000
假设采用“5-路平衡归并”策 略
R1
5000
R2 R3 R4 第一趟归并 R11 第二趟归并
R5
R6
R7
R8 R12
R9
R10
10000
记录有序序列
只需要进行 2 趟归并, 访问外存次数 = 100+1002 = 300。
结论:

增大归并路数 k , 可减少归并趟数 S , 从而减少总读 写磁盘次数 d 。
29 29 29 32
归并段3
15 15 56
归并段4
17 17 21
归并段0
44
44
归并段1
10 10 12
归并段2
i
0 1 2 3 4 5 6 7 8 9 ls0 ls1 ls2 ls3 ls4 b0 b1 b2 b3 b4
1.产生“败者树” 2. 输出当前最小;
ls0 1 用b0 , b1, b2, b3, b4指示参加 归并的外部结点; 用ls[1, 2, 3, 4, 5]指示于内部结点 ls1 4 取值对应的外部结点;
归并段3
b4 56
56
归并段4
21
归并段0
44
归并段1

归并段2
i
0 1 2 3 4 5 6 7 8 9 ls0 ls1 ls2 ls3 ls4 b0 b1 b2 b3 b4
3 ls0 0
用b0 , b1, b2, b3, b4指示参加 归并的外部结点; 用ls[1, 2, 3, 4, 5]指示内部结点 对应的外部结点;
归并段4
1 2
ls3 b2 10 10 12
归并段2
b3 29 29 32
归并段3
i
0 1 2 3 4 5 6 7 8 9 ls0 ls1 ls2 ls3 ls4 b0 b1 b2 b3 b4
用b0 , b1, b2, b3, b4指示参加 归并的外部结点; 用ls[1, 2, 3, 4, 5]指示内部结点 对应的外部结点;
ls0 2 2 ls1 4 4
输出: 05,10,12
0 ls2
ls4 3 b0 17 b1 44 17 b4 15 44 21 15 56 归并段0 归并段1
归并段4
1 1
ls3 b2 12
b3 29 29 32
归并段3
12
归并段2
i
0 1 2 3 4 5 6 7 8 9 ls0 ls1 ls2 ls3 ls4 b0 b1 b2 b3 b4
22 15 22 25 25
相等。
25 40 99 25 55
32 36 47
22
36
47
32
15 99
25
40
55
败者树是树型选择排序的一种变型。
败者树——每个非终端结点均表示其左右孩子结点中的
“败者” (关键字码小者)。
22 25 15 32 36 99 36 36 32 47 99 25 22 32 25 40 55
2. 外部排序的基本过程
采用“2-路迭代归并”策略,由相对独立的两
个步骤组成:
(1) 按可用内存大小,利用内部排序方法,构造若
干个( 初始)有序子序列,并存到外存,通常称外
存中这些记录有序子序列为 “归并段”; (2) 通过“逐趟归并”,逐步扩大各个归并段的长 度,直至外存中整个记录序列按关键字有序为止。
举例: 已知有一个含10,000个记录的磁盘文件, 而当前所用的计算机一次只能对1,000个 记录进行内部排序。 则首先利用内部排序的方法得到 10 个 “初始归并段” ,然后进行逐趟归并。
则归并过程如下:
1000
每个Ri 包含1000个记录
初始排序使每个Ri 中的记录有序
R1
2000
R2
R3
R4
归并段4
2 1
ls3 b2
b3 29 29 32
归并段3

归并段2
i
0 1 2 3 4 5 6 7 8 9 ls0 ls1 ls2 ls3 ls4 b0 b1 b2 b3 b4
用b0 , b1, b2, b3, b4指示参加 归并的外部结点; 用ls[1, 2, 3, 4, 5]指示内部结点 对应的外部结点;
内部归并排序的时间
内外存的信息交换的时间,主要取决于 外排过程中访问外存的次数;
例如上页的归并例子
假设外存的页块大小为 200 (每访问外存一次可读/写200个记
录),则对含10000个记录的文件,处理一遍需访问外存500次。
操 作
访问外存次数
内部初始排序
一趟归并 总计
50读+50写 = 100读/写
3 ls 0 2
ls0 4 0 ls1 1 1
输出: 05,10,12,15 17,
2 ls3
b2
ls4 3 4
b3 29 29 32
归并段3
b0 17 b1 44 17 b4 56 44 21 56 归并段0 归并段1
归并段4

归并段2
i
0 1 2 3 4 5 6 7 8 9 ls0 ls1 ls2 ls3 ls4 b0 b1 b2 b3 b4
用b0 , b1, b2, b3, b4指示参加 归并的外部结点; 用ls[1, 2, 3, 4, 5]指示内部结点 对应的外部结点;
ls0 2 4 ls1 4 1
输出: 05,10,12,15
0 ls2
ls4 3 b0 17 b1 44 17 b4 15 44 21 15 56 归并段0 归并段1
磁带是一种“启停”的设备,信息在磁带上
不能连续存放,在相邻的两个字符组之间均
留有空隙。
从磁带存取一个页块的信息所需时间为: TI/O = ta + n × tw
其中: ta 为延迟时间,
tw 为传输一个字符的时间,
百度文库
n 为页块内的字符个数。
磁盘的组织结构: 记录盘面、磁道和扇面。 磁盘信息的存取单位为一个扇面的字符组, 它由一个三维地址确定:柱面号、记录面号 和页块号。 从磁盘存取一个页块的信息所需时间为: TI/O = tseek + tla + n × tw 其中: tseek 为延迟时间,tla为等待时间, twm 为传输一个字符的时间, n 为页块内的字符个数。
22 99
36
47
32
15 99
25
40
55
采用“败者树”或“胜者树”进行k路归并的分 析: 使用“败者树”或“胜者树”从 k 个归并段中选 最小者, 选出排序码最小的记录只需比较 log2k 次。 k 路归并总的比较次数: S*(n-1)* log2k = logkm * (n-1) * log2k = log2m * (n-1) * log2k / log2k = log2m * (n-1)
用b0 , b1, b2, b3, b4指示参加 归并的外部结点; 用ls[1, 2, 3, 4, 5]指示内部结点 对应的外部结点;
3 ls 3 2
ls0 0 0 ls1 1 1
输出: 05,10,12,15, 17,21
2 ls3
b2
ls4 4
b0 21 b1 44
b3 29 29 32
第一趟可将 m 个初始归并段归并为 l = m/k 个 归并段, 以后每一趟归并将 l 个归并段归并成 l = l / k 个归并段,直到最后形成一个大的归并段 为止。树的高度= logkm 。即:归并趟数S。

S = logkm
增大 k 或者减少 m。
问题:
是否 k 越大越好?
首先考虑在内存中进行内部 k 路归并时的情况: 从 k 个归并段中各取一个记录进行比较,选出最小 者,共需要比较 k-1 次; 如果每一趟需要归并的记录总数为 n ,则每趟归并 需要做(n-1)*(k-1)次比较; S 趟归并总共需要的比较次数为 : S*(n-1)* (k-1) = log k m * (n-1) * (k-1) = log2m * (n-1) * (k-1) / log2k • 当初始归并段个数 m 与记录总数 n 一定时, log2m*(n-1) = const • 而 (k-1) / log2k 在 k 增大时趋于无穷大。 • 因此, 增大归并路数 k, 使得内部归并的时间增大。

使用“败者树”或“胜者树”排序总的比较次数 与 k 无关, 总的内部归并时间不会随 k 的增大而增 大。 下面讨论利用败者树在 k 个输入归并段中选择最 小者,实现归并排序的方法。

三、多路平衡归并的实现(采用“败者树”)
例:关键字序列:{05,10,12,15,17,21,29,32,44,56} 分为5个初始段。
相关文档
最新文档