第十一章 外部排序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
2
b1 9 9 18 20 . b2 20
3 4
b4 12 12 37 48 .
10
10 15 16 .
20 22 40 .
§11.4 置换-选择排序
• 问题: 是否可以不用内部排序构造初始归并段? • 例:若初始文件含有24个记录,其的关键字为: 51,49,39,46,38,29,14,61,15,1,48,52, 3,63,27,4,1389,24,46,58,33,76。 假设内存工作区可容纳6个记录,则可得如下4个初始 归并段: • RUN1:29,38,39,46,49,51 • RUN2:1,14,15,30,48,61 • RUN3:3,4,13,27,52,63 • RUN4:24,33,46,58,76,89
18
20
24
47
91
9 30 12 18 3 17 2 6 24
51
38
32
121
• 假设每个记录占一个物理块,则两趟归并所 需对外存 进行的读/写次数为 (9+30+12+18+3+17+2+6+24)*2*2=484 • 显然,归并方案不同,所得归并树亦不同,树的带权 路径长度(或外存读/写次数)亦不同。回顾在第六章 中哈夫曼树构造方法。 • 可得如下图所示:3-路平衡归并的最佳归并树(446次 读/写)
FI
3,63,27,4,… 63,27,4,…
27,4,… 4,… …… ……
29,38,39,46,49,51,61 48,1,15,30,52,14 1
1,3 1,3,14 1,3,14,15 ……
48,3,15,30,52,14
48,63,15,30,52,14 48,63,15,30,52,27 48,63,4,30,52,27 ……
•RUN1: 29,38,39,46,49,51,61
结论:
•RUN2: 1,3,14,15,27,30,48,52,63,89 •RUN3: 4,13,24,33,46,58,76
§11.5最佳归并树
• 问题: 由置换-选择生成所得的初始归并段,其各段长 度不等对平衡归并有何影响? • 假设由置换-选择得到9个初始归并段,其长度(即记 录数)依次为:9,30,12,18,3,17,2,6,24。 现作3-路平衡归并,其归并树如图所示:
§11.2 外部排序的方法
• 外部排序基本上由两个相对独立的阶段组成。
1. 按可以用内存大小,将外存上含n个记录的文件分成 若干长度为L的子文件或段(segment),依次读入内存并 利用有效的内部排序方法对它们进行排序,
2. 将排序后得到的有序子文件重新写入外存,通常称 这些有序子文件为归并段或顺串(run);然后,对这些归 并进行逐趟归并,使归并段(有序的子文件)逐渐有 小变大,直至得到整个有序文件为止。
FO
空 空 29 29 29,38 29,38
WA
空 51,49,39,46,38,29 51,49,39,46,38 51,49,39,46,38,14 51,49,39,46, ,14 51,49,39,46,61,14
FI
51,49,39,46,38,29,14,61,15,30,1,48,52, … 14,61,15,30,1,48,52,3,63,27,4,… 14,61,15,30,1,48,52,3,63,27,4,… 61,15,30,1,48,52,3,63,27,4,… 61,15,30,1,48,52,3,63,27,4,… 15,30,1,48,52,3,63,27,4,…
• 置换-选择排序算法思想:
• 初始化: 输入文件FI,输出文件FO,内存工作区为WA . FO和WA置空,内存工作区为空,WA的容量可容纳w 个记录. • (1)从FI输入w个记录到工作区WA。 • (2)从WA中选出最小关键字记录,记MIN记录。 • (3)将MIN输出到FO中去。 • (4)若FI不为空,则从FI输入下一个记录到WA中。 • (5)从WA中所有关键字比MIN大的记录中选出最小关 键字记录,作为新的MIN记录。 • (6)重复(3)—(5),直至在WA 中选不出新的MIN为止, 则得一初始归并段,输出之。 • (7)重复(2)—(6),直至WA为空。则得全部初始归并段。
15,30,1,48,52,3,63,27,4,… 30,1,48,52,3,63,27,4,…
30,1,48,52,3,63,27,4,… 1,48,52,3,63,27,4,… 48,52,3,63,27,4,… 52,3,63,27,4,…
FO
29,38,39,46,49,51,61
WA
48,1,15,30,52,14 3,63,27,4,…
第十一章 外部排序 • • • • • 外存信息的存取 外部排序的方法 多路平衡归并的实现 置换——选择排序 最佳归并树
§11.1 外部信息的存取
• 计算机一般有两种存储器:内存储器(主存)和外存储 器(辅存)。内存的信息可随机存取,且存取速度快, 但价格贵。容量小。外存储器包括磁带和磁盘(或磁 鼓),前者为顺序存取的设备,后者为随机存取的设备。 1. 磁带信息的存取 2. 磁盘信息的存取 3. 光盘信息的存取
R1’
§11.2 外部排序的方法
• 从上例中我们可以得到: 一共归并了4 趟
外存信息读写500次
问题:是否可以改进减少外存信息读写? 可以采用多路归并 即: R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R1’ 有序文件 R2’
一共归并了2趟,外存读写300次
§11.2 外部排序的方法
29,38,39 29,38,39
29,38,39,46 29,38,39,46 29,38,39,46,49 29,38,39,46,49,51
51,49, ,46,61,14 51,49,15,46,61,14
51,49,15, ,61,14 51,49,15,30,61,14 51,1,15,30,61,14 48,1,15,30,61,14
m为经过内部排序之后得到的初始归并段的个数; s为归并的趟数;d为总的读/写次数。
§11.2 外部排序的方法
• 例:有10000条记录,通过10次内部排序得到10个初始归 并段R1-R10, 每段有1000条记录.
R1
R2 R3 R4 R5 R6 R7 R8 R9 R10
R2’ R1’’ R1’’’ 有序文件 R3’ R2’’ R4’ R5’ R3’’ R2’’’
2 9 3 11 6 12 17 18 24
30
32
59
121
• 例:前例中少了长度为30的归并段。怎样处理? • 解决方案: 当初始归并的数目不足时,需附加长度为零的 “虚段”,按照哈夫曼树构成的原则,权为零的叶子应离 树根最远,则只有8个初始归并段的归并树应如下图所示:
2 3 6 9
5
12
17
§11.3 多路平衡归并的实现
• 例:
3 1
胜利者
失败者
0
b0 b3 6 6 15 25
.
2
b1 9 9 18 20 . b2 20
4
b4 12 12 37 48 .
10
10 15 16 .
20 22 40 .
§11.3 多路平衡归并的实现
• 例:
1 3 0 1
胜利者
失败者
4 0
b0 b3 15 15 25
• 结论: 对同一文件,进行外部排序时所需读写外存的次数和 归 并趟数s成正比. 对m个初始归并段进行k-路平衡归并时, 归并趟数为: s = 向上取整( logkm ) 显然: 增加k可以减少s
§11.3 多路平衡归并的实现
• 为了减少归并趟数, 我们增大k . 问题: 增大了k 又会出现新的问题 . • 增加内部归并所需的时间, 因为比较的元素多了, 比较的 次数也就多了 . • 为减少比较次数, 解决方法我们引出: 败者树 . • 败者树:在双亲结点中记下刚进行完的这场比赛中的败 者,而让胜者去参加更高一层的比赛,便可得到一棵 “败者树”。
§11.4 置换-选择排序
• 置换-选择排序就是新的构造方法: • • • • 上例用此法, 可求得如下3个初始归并段: RUN1: 29,38,39,46,49,51,61 RUN2: 1,3,14,15,27,30,48,52,63,89 RUN3: 4,13,24,33,46,58,76
• 问题:怎样构造呢?
§11.2 外部排序的方法
• 一般情况下,外部排序所需总的时间
=内部排序所需的时间
+外存信息读写的时间 +内部归并所需的时间
m*tis
d *tIO s *utmg
其中:
tis是为得到源自文库个初始归并段进行排序所需时间的均值; tIO是进行一次外存读/写时间的均值;
utmg是对u个记录进行内部归并所需时间;
2
b1 9 9 18 20 . b2 20
3 4
b4 12 12 37 48 .
10
10 15 16 .
20 22 40 .
§11.4 置换-选择排序
• 问题: 是否可以不用内部排序构造初始归并段? • 例:若初始文件含有24个记录,其的关键字为: 51,49,39,46,38,29,14,61,15,1,48,52, 3,63,27,4,1389,24,46,58,33,76。 假设内存工作区可容纳6个记录,则可得如下4个初始 归并段: • RUN1:29,38,39,46,49,51 • RUN2:1,14,15,30,48,61 • RUN3:3,4,13,27,52,63 • RUN4:24,33,46,58,76,89
18
20
24
47
91
9 30 12 18 3 17 2 6 24
51
38
32
121
• 假设每个记录占一个物理块,则两趟归并所 需对外存 进行的读/写次数为 (9+30+12+18+3+17+2+6+24)*2*2=484 • 显然,归并方案不同,所得归并树亦不同,树的带权 路径长度(或外存读/写次数)亦不同。回顾在第六章 中哈夫曼树构造方法。 • 可得如下图所示:3-路平衡归并的最佳归并树(446次 读/写)
FI
3,63,27,4,… 63,27,4,…
27,4,… 4,… …… ……
29,38,39,46,49,51,61 48,1,15,30,52,14 1
1,3 1,3,14 1,3,14,15 ……
48,3,15,30,52,14
48,63,15,30,52,14 48,63,15,30,52,27 48,63,4,30,52,27 ……
•RUN1: 29,38,39,46,49,51,61
结论:
•RUN2: 1,3,14,15,27,30,48,52,63,89 •RUN3: 4,13,24,33,46,58,76
§11.5最佳归并树
• 问题: 由置换-选择生成所得的初始归并段,其各段长 度不等对平衡归并有何影响? • 假设由置换-选择得到9个初始归并段,其长度(即记 录数)依次为:9,30,12,18,3,17,2,6,24。 现作3-路平衡归并,其归并树如图所示:
§11.2 外部排序的方法
• 外部排序基本上由两个相对独立的阶段组成。
1. 按可以用内存大小,将外存上含n个记录的文件分成 若干长度为L的子文件或段(segment),依次读入内存并 利用有效的内部排序方法对它们进行排序,
2. 将排序后得到的有序子文件重新写入外存,通常称 这些有序子文件为归并段或顺串(run);然后,对这些归 并进行逐趟归并,使归并段(有序的子文件)逐渐有 小变大,直至得到整个有序文件为止。
FO
空 空 29 29 29,38 29,38
WA
空 51,49,39,46,38,29 51,49,39,46,38 51,49,39,46,38,14 51,49,39,46, ,14 51,49,39,46,61,14
FI
51,49,39,46,38,29,14,61,15,30,1,48,52, … 14,61,15,30,1,48,52,3,63,27,4,… 14,61,15,30,1,48,52,3,63,27,4,… 61,15,30,1,48,52,3,63,27,4,… 61,15,30,1,48,52,3,63,27,4,… 15,30,1,48,52,3,63,27,4,…
• 置换-选择排序算法思想:
• 初始化: 输入文件FI,输出文件FO,内存工作区为WA . FO和WA置空,内存工作区为空,WA的容量可容纳w 个记录. • (1)从FI输入w个记录到工作区WA。 • (2)从WA中选出最小关键字记录,记MIN记录。 • (3)将MIN输出到FO中去。 • (4)若FI不为空,则从FI输入下一个记录到WA中。 • (5)从WA中所有关键字比MIN大的记录中选出最小关 键字记录,作为新的MIN记录。 • (6)重复(3)—(5),直至在WA 中选不出新的MIN为止, 则得一初始归并段,输出之。 • (7)重复(2)—(6),直至WA为空。则得全部初始归并段。
15,30,1,48,52,3,63,27,4,… 30,1,48,52,3,63,27,4,…
30,1,48,52,3,63,27,4,… 1,48,52,3,63,27,4,… 48,52,3,63,27,4,… 52,3,63,27,4,…
FO
29,38,39,46,49,51,61
WA
48,1,15,30,52,14 3,63,27,4,…
第十一章 外部排序 • • • • • 外存信息的存取 外部排序的方法 多路平衡归并的实现 置换——选择排序 最佳归并树
§11.1 外部信息的存取
• 计算机一般有两种存储器:内存储器(主存)和外存储 器(辅存)。内存的信息可随机存取,且存取速度快, 但价格贵。容量小。外存储器包括磁带和磁盘(或磁 鼓),前者为顺序存取的设备,后者为随机存取的设备。 1. 磁带信息的存取 2. 磁盘信息的存取 3. 光盘信息的存取
R1’
§11.2 外部排序的方法
• 从上例中我们可以得到: 一共归并了4 趟
外存信息读写500次
问题:是否可以改进减少外存信息读写? 可以采用多路归并 即: R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R1’ 有序文件 R2’
一共归并了2趟,外存读写300次
§11.2 外部排序的方法
29,38,39 29,38,39
29,38,39,46 29,38,39,46 29,38,39,46,49 29,38,39,46,49,51
51,49, ,46,61,14 51,49,15,46,61,14
51,49,15, ,61,14 51,49,15,30,61,14 51,1,15,30,61,14 48,1,15,30,61,14
m为经过内部排序之后得到的初始归并段的个数; s为归并的趟数;d为总的读/写次数。
§11.2 外部排序的方法
• 例:有10000条记录,通过10次内部排序得到10个初始归 并段R1-R10, 每段有1000条记录.
R1
R2 R3 R4 R5 R6 R7 R8 R9 R10
R2’ R1’’ R1’’’ 有序文件 R3’ R2’’ R4’ R5’ R3’’ R2’’’
2 9 3 11 6 12 17 18 24
30
32
59
121
• 例:前例中少了长度为30的归并段。怎样处理? • 解决方案: 当初始归并的数目不足时,需附加长度为零的 “虚段”,按照哈夫曼树构成的原则,权为零的叶子应离 树根最远,则只有8个初始归并段的归并树应如下图所示:
2 3 6 9
5
12
17
§11.3 多路平衡归并的实现
• 例:
3 1
胜利者
失败者
0
b0 b3 6 6 15 25
.
2
b1 9 9 18 20 . b2 20
4
b4 12 12 37 48 .
10
10 15 16 .
20 22 40 .
§11.3 多路平衡归并的实现
• 例:
1 3 0 1
胜利者
失败者
4 0
b0 b3 15 15 25
• 结论: 对同一文件,进行外部排序时所需读写外存的次数和 归 并趟数s成正比. 对m个初始归并段进行k-路平衡归并时, 归并趟数为: s = 向上取整( logkm ) 显然: 增加k可以减少s
§11.3 多路平衡归并的实现
• 为了减少归并趟数, 我们增大k . 问题: 增大了k 又会出现新的问题 . • 增加内部归并所需的时间, 因为比较的元素多了, 比较的 次数也就多了 . • 为减少比较次数, 解决方法我们引出: 败者树 . • 败者树:在双亲结点中记下刚进行完的这场比赛中的败 者,而让胜者去参加更高一层的比赛,便可得到一棵 “败者树”。
§11.4 置换-选择排序
• 置换-选择排序就是新的构造方法: • • • • 上例用此法, 可求得如下3个初始归并段: RUN1: 29,38,39,46,49,51,61 RUN2: 1,3,14,15,27,30,48,52,63,89 RUN3: 4,13,24,33,46,58,76
• 问题:怎样构造呢?
§11.2 外部排序的方法
• 一般情况下,外部排序所需总的时间
=内部排序所需的时间
+外存信息读写的时间 +内部归并所需的时间
m*tis
d *tIO s *utmg
其中:
tis是为得到源自文库个初始归并段进行排序所需时间的均值; tIO是进行一次外存读/写时间的均值;
utmg是对u个记录进行内部归并所需时间;