数据结构 第十一章外部排序

35
数数数数 数数 中中中中中中中中中中中中 中中中中中中中中中中中中 数数数数 数数数数 数数 数数 数数数数 数数数数

Upload: angie

Post on 05-Jan-2016

183 views

Category:

Documents


3 download

DESCRIPTION

数据结构 第十一章外部排序. 本章内容 11.1 外存信息的存取 11.2 外部排序的方法 11.3 多路平衡归并的实现 11.4 置换 - 选择排序 11.5 最佳归并树. 11.1 外存信息的存取. 常用的外存储器分类: 顺序存取的设备(如磁带); 随机存取的设备(如磁盘)。 常用的外存储器是磁表面存储器 , 信息记录在一薄层磁性材料的表面上 , 这层材料附着于载体表面 , 随着载体作高速旋转或直线运动 , 在运动过程中用磁头进行读或写。 外存信息的存取特点 , 决定了外部排序的策略选择。. 记录 1. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 数据结构 第十一章外部排序

《 数据结构》课程

中国科学技术大学网络学院中国科学技术大学网络学院

数据结构数据结构第十一章第十一章 外部排序外部排序

Page 2: 数据结构 第十一章外部排序

本章内容

11.1 11.1 外存信息的存取外存信息的存取11.2 11.2 外部排序的方法外部排序的方法11.3 11.3 多路平衡归并的实现多路平衡归并的实现11.4 11.4 置换置换 -- 选择排序选择排序11.5 11.5 最佳归并树最佳归并树

Page 3: 数据结构 第十一章外部排序

11-3 中国科大《数据结构》

11.1 外存信息的存取

常用的外存储器分类:常用的外存储器分类: 顺序存取的设备(如磁带);顺序存取的设备(如磁带); 随机存取的设备(如磁盘)。随机存取的设备(如磁盘)。

常用的外存储器是磁表面存储器常用的外存储器是磁表面存储器 , , 信息记录在一薄层磁性信息记录在一薄层磁性材料的表面上材料的表面上 , , 这层材料附着于载体表面这层材料附着于载体表面 , , 随着载体作高速旋转或随着载体作高速旋转或直线运动直线运动 , , 在运动过程中用磁头进行读或写。在运动过程中用磁头进行读或写。

外存信息的存取特点外存信息的存取特点 , , 决定了外部排序的策略选择。决定了外部排序的策略选择。

Page 4: 数据结构 第十一章外部排序

11-4 中国科大《数据结构》

11.1 外存信息的存取

磁带信息的存取磁带信息的存取磁带存储器的工作原理和磁带录音机一样磁带存储器的工作原理和磁带录音机一样 , , 不同之处在于不同之处在于

它存储的是数字信息而不是模拟信息。它存储的是数字信息而不是模拟信息。磁带上的信息在横向分布、纵向分布以及首尾标志等都一磁带上的信息在横向分布、纵向分布以及首尾标志等都一

定的格式。定的格式。 以以 1/21/2 英寸九道的磁带为例英寸九道的磁带为例 , , 每一横排就可表示一个字符(每一横排就可表示一个字符( 88

位位 +1+1 个校验位)。个校验位)。 纵向按区进行存储纵向按区进行存储 , , 区的长度不固定区的长度不固定 , , 但有一个范围但有一个范围 , , 例如例如 22

到到 40964096 字节字节 , , 相邻区之间有一定长度的间隔(相邻区之间有一定长度的间隔( IBG, Inter BlIBG, Inter Block Gapock Gap )) , , 作为磁带起停之用。作为磁带起停之用。

记录 1 记录 3记录 2

Page 5: 数据结构 第十一章外部排序

11-5 中国科大《数据结构》

11.1 外存信息的存取

在磁带上读写一块信息所需的时间由两部分组成:在磁带上读写一块信息所需的时间由两部分组成:TTI/OI/O = t = taa + + nn t tww

ttaa 为延迟时间为延迟时间 , , 即读即读 // 写头到达传输信息所在物理快起始位置所写头到达传输信息所在物理快起始位置所需时间;需时间;

ttww 为传输一个字符的时间。为传输一个字符的时间。

显然显然 , , 延迟时间和信息在磁带上的位置、当前读延迟时间和信息在磁带上的位置、当前读 // 写头所写头所在的位置有关。在的位置有关。

所以磁带便宜、可反复使用、是一种顺序存取设备所以磁带便宜、可反复使用、是一种顺序存取设备 , , 但查但查找费时、速度慢(尤其是查找末端记录时)。找费时、速度慢(尤其是查找末端记录时)。

Page 6: 数据结构 第十一章外部排序

11-6 中国科大《数据结构》

11.1 外存信息的存取

磁盘信息的存取磁盘信息的存取磁盘是一种直接存取的存储设备磁盘是一种直接存取的存储设备 (DASD(DASD )。)。

页块的读写时间:页块的读写时间: TTI/OI/O = t = tseekseek + t + tlatencylatency + + nn t twmwm

ttseekseek :寻道时间:寻道时间 ttlatencylatency :等待时间:等待时间 ttwmwm :传输时间:传输时间

Page 7: 数据结构 第十一章外部排序

11-7 中国科大《数据结构》

11.2 外部排序的方法

外部排序基本上由两个相对独立的阶段组成:外部排序基本上由两个相对独立的阶段组成: 首先首先 , , 按可用内存大小按可用内存大小 , , 将外存上含将外存上含 nn 个记录的文件分成若干个记录的文件分成若干

长度为长度为 ll 的子文件或段的子文件或段 (segment), (segment), 依次读入内存并利用有效依次读入内存并利用有效的内部排序方法对它们进行排序的内部排序方法对它们进行排序 , , 并将排序后得到的有序子文并将排序后得到的有序子文件重新写入外存件重新写入外存 , , 通常称这些有序子文件为归并段或顺串通常称这些有序子文件为归并段或顺串 (run)(run);;

然后然后 , , 对这些归并段进行逐躺归并对这些归并段进行逐躺归并 , , 使归并段(有序的子文使归并段(有序的子文件)逐渐由小至大件)逐渐由小至大 , , 直到得到整个有序文件为止。直到得到整个有序文件为止。

Page 8: 数据结构 第十一章外部排序

11-8 中国科大《数据结构》

11.2 外部排序的方法

例:一文件含例:一文件含 1000010000 记录记录 , , 通过通过 1010 次内部排序得到次内部排序得到 1010 个初始归个初始归并段并段 R1…R10, R1…R10, 其中每一段都含有其中每一段都含有 10001000 个记录。个记录。

然后作两两归并:然后作两两归并:

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10

R1’ R2’ R3’ R4’ R5’

R1’’ R2’’ R3’’

R1’’’ R2’’’

有序文件 由由 1010 个初始归并段到一个有序文件个初始归并段到一个有序文件 , , 共进行了共进行了 44 趟归并趟归并 , , 每一趟每一趟

都从都从 mm 个归并段得到个归并段得到 ceil(m/2)ceil(m/2) 个归并段。这种归并方法称为个归并段。这种归并方法称为 2-2- 路路平衡归并平衡归并。。

Page 9: 数据结构 第十一章外部排序

11-9 中国科大《数据结构》

11.2 外部排序的方法

外存上信息的读外存上信息的读 // 写是以“物理块”为单位进行的写是以“物理块”为单位进行的 , , 假设每个物理假设每个物理块可以容纳块可以容纳 200200 个记录个记录 , , 则每一趟归并需进行则每一趟归并需进行 5050次“读”和次“读”和 5050次“写”次“写” , 4, 4趟归并加上内部排序时所需进行的读趟归并加上内部排序时所需进行的读 // 写使得在外排写使得在外排序中总共需进行序中总共需进行 500500次读次读 // 写。写。

Page 10: 数据结构 第十一章外部排序

11-10 中国科大《数据结构》

11.2 外部排序的方法

外部排序所需总的时间外部排序所需总的时间 = = 内部排序(产生初始归并段)所需的时间内部排序(产生初始归并段)所需的时间 ((m m × × ttISIS))

+ + 外存信息读写的时间外存信息读写的时间 ((d d ×× ttIOIO) ) ++ 内部归并所需的时间内部归并所需的时间 ((s s ×× ututmgmg))

其中:其中: ttIS IS 是为得到一个初始归并段进行内部排序所需时间的均值;是为得到一个初始归并段进行内部排序所需时间的均值; ttIO IO 是进行一次外存读是进行一次外存读 // 写时间的均值;写时间的均值; ututmg mg 是对是对 uu个记录进行内部归并所需时间;个记录进行内部归并所需时间; m m 为经过内部排序之后得到的初始归并段的个数;为经过内部排序之后得到的初始归并段的个数; s s 为归并的趟数;为归并的趟数; d d 为总的读为总的读 // 写次数。写次数。

于是上例进行外排序所需总的时间为:于是上例进行外排序所需总的时间为: 10 10 ttIS IS + 500 + 500 ttIOIO + 4x10000 + 4x10000 ttmgmg

显然显然 ttIOIO较较 ttmgmg要大的多要大的多 , , 因此提高外排序的效率应主要着眼于减少外因此提高外排序的效率应主要着眼于减少外存信息读写的次数存信息读写的次数 dd。。

Page 11: 数据结构 第十一章外部排序

11-11 中国科大《数据结构》

11.2 外部排序的方法

dd 和“归并过程”的关系:和“归并过程”的关系:若对上例进行若对上例进行 55路平衡归并:路平衡归并:

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10

R1’ R2’

有序文件仅需两趟归并仅需两趟归并 , , 总的读总的读 // 写次数便减少为:写次数便减少为: 2x100+100=300, 2x100+100=300, 比比 22路归并减少了路归并减少了 200200次的读次的读 // 写。对同一文件写。对同一文件 , , 进行外排序时所需读进行外排序时所需读 //写外存的次数和归并的趟数写外存的次数和归并的趟数 ss 成正比。一般情况下成正比。一般情况下 , , 对对 mm 个初始归个初始归并段进行并段进行 kk 路平衡归并时路平衡归并时 , , 归并的趟数归并的趟数 s=floor(logs=floor(logkkmm).).可见:若能增加可见:若能增加 kk 或减少或减少 mm 便能减少便能减少 s, s, 因此减少因此减少 d.d.

Page 12: 数据结构 第十一章外部排序

11-12 中国科大《数据结构》

11.3 多路平衡归并的实现

对于对于 22 路归并路归并 , , 令两个归并段上有令两个归并段上有 uu个记录个记录 , , 每得到归并后的一个每得到归并后的一个记录记录 , , 仅需一次比较即可仅需一次比较即可 , , 因此得到含因此得到含 uu个记录的归并段需进行个记录的归并段需进行u-1u-1次比较。次比较。

对于对于 kk 路归并路归并 , , 令令 uu个记录分布在个记录分布在 kk 个归并段上个归并段上 , , 显然显然 , , 归并后的归并后的第一个记录应是第一个记录应是 kk 个归并段中关键字最小的记录个归并段中关键字最小的记录 , , 这需要进行这需要进行 k-1k-1次比较次比较 , , 得到得到 uu个记录的归并段个记录的归并段 , , 共需共需 (u-1)(k-1)(u-1)(k-1)次比较。由此次比较。由此 , , 对对 nn 个记录的文件进行外排序时个记录的文件进行外排序时 , , 在内部归并过程中进行的总的比在内部归并过程中进行的总的比较次数为较次数为 s(k-1)(n-1)s(k-1)(n-1) 。假设所得初始归并段为。假设所得初始归并段为 mm 个个 , , 则归并过程中则归并过程中进行比较的总的时间为:进行比较的总的时间为:

floor(logfloor(logkkmm)(k-1)(n-1)t)(k-1)(n-1)tmgmg = floor(log = floor(log22mm/log/log22kk)(k-1)(n-1)t)(k-1)(n-1)tmgmg

由于由于 (k-1)/log2k (k-1)/log2k 随 随 k k 的增长而增长的增长而增长 , , 这将抵消由于增大这将抵消由于增大 kk 而减少而减少外存信息读写时间所得效益。外存信息读写时间所得效益。

Page 13: 数据结构 第十一章外部排序

11-13 中国科大《数据结构》

11.3 多路平衡归并的实现

在进行在进行 kk 路归并时利用“败者树路归并时利用“败者树 (Tree of Loser)(Tree of Loser)”, ”, 则可使在则可使在 kk 个个记录中选出关键字最小的记录时仅需进行记录中选出关键字最小的记录时仅需进行 floor(log2k)floor(log2k) 次比较次比较 , , 从从而使总的归并时间变为:而使总的归并时间变为:

floor(logfloor(log22m)(n-1)tm)(n-1)tmgmg

与与 kk 无关无关 , , 不再随不再随 kk 的增长而增长。的增长而增长。

Page 14: 数据结构 第十一章外部排序

11-14 中国科大《数据结构》

11.3 多路平衡归并的实现

胜者树及其使用胜者树及其使用胜者进入下一轮胜者进入下一轮 , , 直至决出本次比赛的冠军。决出冠军之后直至决出本次比赛的冠军。决出冠军之后 , , 充分充分利用上一次比赛的结果利用上一次比赛的结果 , , 使得更快地挑出亚军、第三名 …… 。使得更快地挑出亚军、第三名 …… 。

7 295 97654

挑出冠军

需要进行 k-1 次比较 , 此处需要比较 3 次。

95

5

32

05

1

765432105 5 9 5 7 29 95

Page 15: 数据结构 第十一章外部排序

11-15 中国科大《数据结构》

11.3 多路平衡归并的实现

胜者树及其使用胜者树及其使用胜者进入下一轮胜者进入下一轮 , , 直至决出本次比赛的冠军。决出冠军之后直至决出本次比赛的冠军。决出冠军之后 , , 充分充分利用上一次比赛的结果利用上一次比赛的结果 , , 使得更快地挑出亚军、第三名 …… 。使得更快地挑出亚军、第三名 …… 。

7 2916 97654

挑出亚军需要进行 log2k 次比较 , 此处需要比较 2次。

97

7

32

07

1

765432107 7 9 16 7 29 97

Page 16: 数据结构 第十一章外部排序

11-16 中国科大《数据结构》

11.3 多路平衡归并的实现

胜者树及其使用胜者树及其使用 胜者进入下一轮 胜者进入下一轮 , , 直至决出本次比赛的冠军。决出冠军之后直至决出本次比赛的冠军。决出冠军之后 , , 充分充分利用上一次比赛的结果利用上一次比赛的结果 , , 使得更快地挑出亚军、第三名 …… 。使得更快地挑出亚军、第三名 …… 。

决出第一名需比较: 决出第一名需比较: k - 1 k - 1 次次 决出第二名需比较: 决出第二名需比较: loglog22k k 次次 决出第三名需比较: 决出第三名需比较: loglog22k k 次次 ………………………………… …………………………………

结果:采用胜者树后结果:采用胜者树后 , , 从 从 k k 个元素中挑选一个最小的元素仅需 个元素中挑选一个最小的元素仅需 lologg22k k 次比较次比较 , , 这时总的比较次数下降为:这时总的比较次数下降为:

loglogkkm × logm × log22k × ( n - 1 ) × tk × ( n - 1 ) × tmgmg = = loglog22m × ( n - 1 ) × tm × ( n - 1 ) × tmgmg

该结果和 该结果和 k k 无关无关 , , 这是通过多用空间换来的。这是通过多用空间换来的。 改进:采用胜者树改进:采用胜者树 , k, k 个元素中最小的元素输出之后个元素中最小的元素输出之后 , , 从根结点到从根结点到

它的相应的叶子结点路径上的结点都需要进行修改它的相应的叶子结点路径上的结点都需要进行修改 , , 为了加快程序为了加快程序运行的速度产生了败者树。运行的速度产生了败者树。

Page 17: 数据结构 第十一章外部排序

11-17 中国科大《数据结构》

11.3 多路平衡归并的实现

败者树败者树在父节点中记下刚进行完的比赛中的败者在父节点中记下刚进行完的比赛中的败者 , , 但同样让胜者去参加下但同样让胜者去参加下一轮的竞赛一轮的竞赛 , , 便得到一棵“败者树”。便得到一棵“败者树”。

Page 18: 数据结构 第十一章外部排序

11-18 中国科大《数据结构》

11.3 多路平衡归并的实现

下图即为一棵实现下图即为一棵实现 5-5-路归并的败者树路归并的败者树 ls[0…4], ls[0…4], 图中方形结点表示图中方形结点表示叶子结点叶子结点 ((也可看成是外结点也可看成是外结点 ), ), 分别为分别为 55个归并段中当前参加归并个归并段中当前参加归并的待选择记录的关键码;败者树中根结点的待选择记录的关键码;败者树中根结点 ls[1]ls[1]的双亲结点的双亲结点 ls[0]ls[0]为为“冠军”“冠军” , , 在此指示各归并段中的最小关键码记录为第三段中的记在此指示各归并段中的最小关键码记录为第三段中的记录;结点录;结点 ls[3]ls[3] 指示指示 b1b1 和和 b2b2 两个叶子结点中的败者即是两个叶子结点中的败者即是 b2, b2, 而胜而胜者者 b1b1 和和 b3(b3b3(b3是叶子结点是叶子结点 b3b3、、 b4b4 和和 b0b0经过两场比赛后选出的经过两场比赛后选出的获胜者获胜者 ))进行比较进行比较 , , 结点结点 ls[1]ls[1] 则指示它们中的败者为则指示它们中的败者为 b1b1 。。

Page 19: 数据结构 第十一章外部排序

11-19 中国科大《数据结构》

11.3 多路平衡归并的实现

5-5- 路归并的败者树例路归并的败者树例

9 20

ls[0]

ls[1]

ls[3]ls[2]

ls[4] b0 b1 b2

b4b3

61525

123748

101515

91820

202240

2

1

3

0

6 12

104

Page 20: 数据结构 第十一章外部排序

11-20 中国科大《数据结构》

11.3 多路平衡归并的实现

在选得最小关键码的记录之后在选得最小关键码的记录之后 , , 只要修改叶子结点只要修改叶子结点 b3b3中的值中的值 , , 使使其为同一归并段中的下一个记录的关键码其为同一归并段中的下一个记录的关键码 , , 然后从该结点向上和双然后从该结点向上和双亲结点所指的关键码进行比较亲结点所指的关键码进行比较 , , 败者留在该双亲败者留在该双亲 , , 胜者继续向上直胜者继续向上直至树根的双亲。如下图所示。当第至树根的双亲。如下图所示。当第 33个归并段中第个归并段中第 22 个记录参加归个记录参加归并时并时 , , 选得最小关键码记录为第一个归并段中的记录。为了防止在选得最小关键码记录为第一个归并段中的记录。为了防止在归并过程中某个归并段变为空归并过程中某个归并段变为空 , , 可以在每个归并段中附加一个关键可以在每个归并段中附加一个关键码为最大的记录。当选出的“冠军”记录的关键码为最大值时码为最大的记录。当选出的“冠军”记录的关键码为最大值时 , , 表表明此次归并已完成。明此次归并已完成。

Page 21: 数据结构 第十一章外部排序

11-21 中国科大《数据结构》

11.3 多路平衡归并的实现

5-5- 路归并的败者树例路归并的败者树例

9 20

ls[0]

ls[1]

ls[3]ls[2]

ls[4] b0 b1 b2

b4b3

1525

123748

101515

91820

202240

2

0

1

4

15 12

103

Page 22: 数据结构 第十一章外部排序

11-22 中国科大《数据结构》

11.3 多路平衡归并的实现

实现实现 k-k- 路归并的败者树的初始化也容易实现路归并的败者树的初始化也容易实现 , , 只要先令所有的非只要先令所有的非终端结点指向一个含最小关键码的叶子结点终端结点指向一个含最小关键码的叶子结点 , , 然后从各叶子结点出然后从各叶子结点出发调整非终端结点为新的败者即可。发调整非终端结点为新的败者即可。

下面程序中简单描述了利用败者树进行下面程序中简单描述了利用败者树进行 k-k- 路归并的过程路归并的过程 , , 为了突为了突出如何利用败者树进行归并出如何利用败者树进行归并 , , 避开了外存信息存取的细节避开了外存信息存取的细节 , , 可以认可以认为归并段已存在。为归并段已存在。

typedef int LoserTree[k]; //败者树是完全二叉树且不含叶子 , 可采用顺序存储结构

typedef struct{KeyType key;

}ExNode, External[k]; // 外结点 , 只存放待归并记录的关键码

Page 23: 数据结构 第十一章外部排序

11-23 中国科大《数据结构》

11.3 多路平衡归并的实现

void K_Merge(LoserTree *ls, External *b){ //k- 路归并处理程序利用败者树 ls 将编号从 0 到 k-1 的 k 个输入归并段中的记录归并到输出归并段 b[0]

// 到 b[k-1] 为败者树上的 k 个叶子结点 , 分别存放 k 个输入归并段中当前记录的关键码

for(i=0;i<k;i++) input(b[i].key); // 分别从 k 个输入归并段读入该段当前第一个记录的关键码到外结点

CreateLoserTree(ls); //建败者树 ls, 选得最小关键码为 b[0].key

while(b[ls[0]].key!=MAXKEY){

q=ls[0]; //q指示当前最小关键码所在归并段

output(q); // 将编号为 q 的归并段中当前 ( 关键码为 b[q].key 的记录写至输出归并段 )

input(b[q].key); //从编号为 q 的输入归并段中读入下一个记录的关键码

Adjust(ls, q); //调整败者树 , 选择新的最小关键码

}

output(ls[0]); // 将含最大关键码MAXKEY 的记录写至输出归并段

}

Page 24: 数据结构 第十一章外部排序

11-24 中国科大《数据结构》

11.3 多路平衡归并的实现

void Adjust(LoserTree *ls, int s){ // 选得最小关键码记录后 , 从叶到根调整败者树 ,

// 选下一个最小关键码 , 从叶子结点 b[s] 到根结 // 点 ls[0] 的路径调整败者树 t=(s+k)/2; //ls[t] 是 b[s] 的双亲结点

while(t>0){

if(b[s].key>b[ls[t]].key)

s<-->ls[t]; //s指示新的胜者

t=t/2;

}

ls[0]=s;

}

void CreateLoserTree(LoserTree *ls){//建立败者树//已知 b[0] 到 b[k-1] 为完全二叉树 ls 的叶子结点存有 k 个关//键码 ,沿从叶子到根的 k条路径将 ls调整为败者树

b[k].key=MINKEY; // 设 MINKEY 为关键码可能的最小值

for(i=0;i<k;i++)

ls[i]=k; // 设置 ls 中“败者”的初值

for(i=k-1;k>0;i--) Adjust(ls, i);

//依次从 b[k-1], b[k-2], …, b[0]出发调整败者

}

最后要提及一点最后要提及一点 , k, k 值的选择并非越大越好值的选择并非越大越好 , , 如何选择合适的如何选择合适的 kk 是一个是一个需要综合考虑的问题。需要综合考虑的问题。

Page 25: 数据结构 第十一章外部排序

11-25 中国科大《数据结构》

11.4 置换 - 选择排序

归并的趟数不仅和归并的趟数不仅和 kk 成反比成反比 , , 也和也和 mm 成正比成正比 , , 因此减少因此减少 mm 是减少是减少ss 的另一条途径。这里的另一条途径。这里 mm 是外部文件经过内部排序之后得到的初始是外部文件经过内部排序之后得到的初始归并段的个数归并段的个数 , m=ceil(n/l), m=ceil(n/l)。。

若要减少若要减少 m, m, 就需要增加就需要增加 l, l, 但是内存的容量有限但是内存的容量有限 , , 利用上利用上一章内排序的方法无法做到一章内排序的方法无法做到 , , 所以必须探索新的排序方法。所以必须探索新的排序方法。

置换置换 -- 选择排序选择排序 (Replacement-Selection Sorting)(Replacement-Selection Sorting) 是在树形选择是在树形选择排序的基础上得来的排序的基础上得来的 , , 它的特点是:在整个排序(得到所有初始归它的特点是:在整个排序(得到所有初始归并段)的过程中并段)的过程中 , , 选择最小(或最大)关键字和输入、输出交叉或选择最小(或最大)关键字和输入、输出交叉或平行进行。平行进行。

Page 26: 数据结构 第十一章外部排序

11-26 中国科大《数据结构》

11.4 置换 - 选择排序

假设初始待排文件为输入文件假设初始待排文件为输入文件 FI, FI, 初始归并段文件为输出文件初始归并段文件为输出文件 FO, FO, 内存工作区为内存工作区为 WA, FOWA, FO 和和 WAWA 的初始状态为空的初始状态为空 , , 并设内存工作区并设内存工作区 WWAA 的容量为的容量为 ww 个记录个记录 , , 则置换则置换 --选择排序的操作过程为:选择排序的操作过程为:

1.1. 从从 FIFI 输入输入 ww 个记录到工作区个记录到工作区 WA;WA;2.2. 从从 WAWA 中选出其中关键字最小值的记录中选出其中关键字最小值的记录 , , 记为记为 MINIMAXMINIMAX记录;记录;3.3. 将将 MINIMAXMINIMAX记录输出到记录输出到 FOFO 中去;中去;4.4. 若若 FIFI 不空不空 , , 则从则从 FIFI 输入下一个记录到输入下一个记录到 WAWA 中;中;5.5. 从从 WAWA 中所有关键字比中所有关键字比 MINIMAXMINIMAX记录的关键字大的记录中选记录的关键字大的记录中选

出最小关键字记录出最小关键字记录 , , 作为新的作为新的 MINIMAXMINIMAX记录;记录;6.6. 重复重复 3-5, 3-5, 直至在直至在 WAWA 中选不出新的中选不出新的 MINIMAXMINIMAX记录为止记录为止 , , 由此由此

得到一个初始归并段得到一个初始归并段 , , 输出一个归并段的结束标志到输出一个归并段的结束标志到 FOFO 中去;中去;7.7. 重复重复 2-6, 2-6, 直至直至 WAWA 为空为空 , , 由此得到全部初始归并段。由此得到全部初始归并段。

Page 27: 数据结构 第十一章外部排序

11-27 中国科大《数据结构》

11.4 置换 - 选择排序

例如:初始文件含例如:初始文件含 2424 个记录个记录 , , 关键字分别为:关键字分别为:51, 49, 39, 46, 38, 2951, 49, 39, 46, 38, 29, , 14, 61, 15, 30, 1, 4814, 61, 15, 30, 1, 48, , 52, 3, 63, 27, 4, 152, 3, 63, 27, 4, 133, , 89, 24, 46, 58, 33, 7689, 24, 46, 58, 33, 76假设内存工作区可容纳假设内存工作区可容纳 66 个记录,则用内排序的方法可以得到个记录,则用内排序的方法可以得到 44个初始段:个初始段:

RUN1: 29, 38, 39, 46, 49, 51RUN1: 29, 38, 39, 46, 49, 51 RUN2: 1, 14, 15, 30, 48, 61RUN2: 1, 14, 15, 30, 48, 61 RUN3: 3, 4, 13, 27, 52, 63RUN3: 3, 4, 13, 27, 52, 63 RUN3: 24, 33, 46, 58, 76, 89RUN3: 24, 33, 46, 58, 76, 89

而用置换而用置换 --选择排序,则可求得如下选择排序,则可求得如下 33个初始归并段:个初始归并段: RUN1: 29, 38, 39, 46, 49, 51, 61RUN1: 29, 38, 39, 46, 49, 51, 61 RUN2: 1, 3, 14, 15, 27, 30, 48, 52, 63, 89RUN2: 1, 3, 14, 15, 27, 30, 48, 52, 63, 89 RUN3: 4, 13, 24, 33, 46, 58, 76RUN3: 4, 13, 24, 33, 46, 58, 76

Page 28: 数据结构 第十一章外部排序

11-28 中国科大《数据结构》

11.4 置换 - 选择排序 置换置换 -- 选择排序的过程 选择排序的过程 (( 见教材第见教材第 300300 页页 )) ::

FOFO WAWA FIFI

51, 49, 39, 46, 38, 29, 14, 61, 15, 30, 1, 48, 52, 3, 63, 27, 4, 51, 49, 39, 46, 38, 29, 14, 61, 15, 30, 1, 48, 52, 3, 63, 27, 4,

13, 89, 24, 46, 58, 33, 7613, 89, 24, 46, 58, 33, 76

51, 49, 39, 46, 38, 51, 49, 39, 46, 38, 2929 14, 61, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 14, 61, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33,

7676

2929 51, 49, 39, 46, 51, 49, 39, 46, 3838, , 1414 61, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7661, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76

29, 3829, 38 51, 49, 51, 49, 3939, 46, , 46, 6161, 14, 14 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7615, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76

29, 38, 3929, 38, 39 51, 49, 51, 49, 1515, , 4646, 61, 14, 61, 14 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7630, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76

29, 38, 39, 4629, 38, 39, 46 51, 51, 4949, 15,, 15, 30 30, 61, 14, 61, 14 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 761, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76

29, 38, 39, 46, 4929, 38, 39, 46, 49 5151, , 11, 15, 30, 61, 14, 15, 30, 61, 14 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7648, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76

29, 38, 39, 46, 49, 5129, 38, 39, 46, 49, 51 4848, 1, 15, 30, , 1, 15, 30, 6161, 14, 14 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7652, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76

29, 38, 39, 46, 49, 51, 29, 38, 39, 46, 49, 51,

616148, 1, 15, 30, 48, 1, 15, 30, 5252, 14, 14 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 763, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76

…… …… ……

Page 29: 数据结构 第十一章外部排序

11-29 中国科大《数据结构》

11.4 置换 - 选择排序

在在 WAWA 中选择中选择 MINIMAXMINIMAX 记录的过程需利用“败者树”来实现。记录的过程需利用“败者树”来实现。1.1. 内存工作区中的记录作为败者树的外部节点,而败者树的根内存工作区中的记录作为败者树的外部节点,而败者树的根

节点的父节点指示工作区中关键字最小的纪录;节点的父节点指示工作区中关键字最小的纪录;2.2. 为了便于选出为了便于选出 MINIMAXMINIMAX 记录,为每一个记录附设一个所在记录,为每一个记录附设一个所在

归并段的序号,在进行关键字的比较时,现比较段号,段号归并段的序号,在进行关键字的比较时,现比较段号,段号小的为胜者,段号相同的则关键字小的为胜者;小的为胜者,段号相同的则关键字小的为胜者;

3.3. 败者树的建立可从设工作区中所有记录的段号均为“败者树的建立可从设工作区中所有记录的段号均为“ 0”0” 开开始,然后从始,然后从 FIFI逐个输入逐个输入 ww 个记录到工作区是,自下而上调整个记录到工作区是,自下而上调整败者树,由于这些记录的段号为“败者树,由于这些记录的段号为“ 1”1” ,则他们对于“,则他们对于“ 0”0”段的记录而言均为败者,从而逐个填充到败者树的各节点中段的记录而言均为败者,从而逐个填充到败者树的各节点中去。去。

Page 30: 数据结构 第十一章外部排序

11-30 中国科大《数据结构》

11.4 置换 - 选择排序

可以证明可以证明 , , 利用置换利用置换 -- 选择排序,初始归并段的平均长度可达内选择排序,初始归并段的平均长度可达内存允许尺寸存允许尺寸 ww 的二倍。的二倍。

最小值

最大值

值递增

记录数 记录值分布按等概率

当前最小值 段

分界

展开的环路

均 匀 下 雪

W 积雪 ( 内存容量 )

环路起、终点当前车位

扫雪车在环形路上扫雪。将环路截断展开,积雪截面为三角形如上图 , 其面积为W,则车走一圈扫走的面积为 2W.类比到置换 _选择排序如黄字所示。

Page 31: 数据结构 第十一章外部排序

11-31 中国科大《数据结构》

11.5 最佳归并树

由置换由置换 -- 选择生成所得的初始归并段,其各段长度不等。选择生成所得的初始归并段,其各段长度不等。 假如由置换假如由置换 -- 选择得到选择得到 99 个初始归并段,其长度分别为:个初始归并段,其长度分别为: 9, 30, 12, 9, 30, 12,

18, 3, 17, 2, 6, 2418, 3, 17, 2, 6, 24 。作。作 3-3- 路平衡归并(如下图),假设每个记录占路平衡归并(如下图),假设每个记录占一个物理块,则两趟归并所需对外存进行的读一个物理块,则两趟归并所需对外存进行的读 // 写次数为:写次数为:(9+30+12+18+3+17+2+6+24)x2x2=484(9+30+12+18+3+17+2+6+24)x2x2=484

9 30 12

51

18 3 17

38

2 6 24

32

121

Page 32: 数据结构 第十一章外部排序

11-32 中国科大《数据结构》

11.5 最佳归并树

考虑下图的归并过程,仅需对外存进行考虑下图的归并过程,仅需对外存进行 446446 次读次读 // 写,这棵归并树写,这棵归并树为最佳归并树为最佳归并树 (11+32+59+121)x2(11+32+59+121)x2 ,为所有归并策略中所需读,为所有归并策略中所需读 // 写写次数最小的方案。次数最小的方案。

2 3 6

11

30

9 17 18 24

59

121

12

32

Page 33: 数据结构 第十一章外部排序

11-33 中国科大《数据结构》

11.5 最佳归并树

存在有存在有 mm 个叶节点的带权路径长度最短的个叶节点的带权路径长度最短的 kk 叉树,称为霍夫曼树叉树,称为霍夫曼树(Huffman)(Huffman) 。。

对长度不等的对长度不等的 mm 个初始段,以其长度为权,构造一棵霍夫曼树作个初始段,以其长度为权,构造一棵霍夫曼树作为归并树,便可使得在进行外部归并时所需对外存进行的读为归并树,便可使得在进行外部归并时所需对外存进行的读 // 写次写次数达到最小。数达到最小。

2 3

5

24

9 17 18 12

47

91

6

20

Page 34: 数据结构 第十一章外部排序

11-34 中国科大《数据结构》

11.5 最佳归并树

对对 k-k- 路归并而言,若路归并而言,若 (m-1) MOD (k-1) = 0(m-1) MOD (k-1) = 0 ,则导出的霍夫曼树节,则导出的霍夫曼树节点的度数刚好为点的度数刚好为 00 或或 kk ,否则,可附加,否则,可附加k - (m-1) MOD (k-1) – 1k - (m-1) MOD (k-1) – 1

个虚段,即第一次归并为 个虚段,即第一次归并为 (m-1) MOD (k-1) + 1(m-1) MOD (k-1) + 1 路归并。路归并。

若按最佳归并树的归并方案进行磁盘归并排序,需在内存建立一张若按最佳归并树的归并方案进行磁盘归并排序,需在内存建立一张载有归并段的长度和它在磁盘上的物理位置的索引表。载有归并段的长度和它在磁盘上的物理位置的索引表。

Page 35: 数据结构 第十一章外部排序

11-35 中国科大《数据结构》

习题

本章习题参见教师网页:本章习题参见教师网页:http://staff.ustc.edu.cn/~leeyihttp://staff.ustc.edu.cn/~leeyi