2012版《数据结构高分笔记》更新补丁之外部排序

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

※特别章外部排序(2012版《数据结构高分笔记》更新补丁)
·外部排序简介
所谓外部排序,即对外存中的数据进行排序(相对于内部排序而言),也可以说是对文件中的数据进行排序。

有了内部排序算法,为什么还要外部排序?因为文件太大,内存放不下。

外排做法可以概括为一句话:将内存作为工作空间来调整外存中数据的位置。

具体可以分成以下三个要点:
①文件在外存中的组织;
②文件在内存中的排序;
③文件在内外存之间的交换。

说明:本补丁是2012年数据结构考研大纲新增内容,虽然知识点不多,但由于第一年被列入考试范围,所以大家要重视。

·归并排序法
归并排序法是外排序中最常用的方法,分为两个执行阶段。

第一阶段:将文件中的数据分段输入到内存中,在内存中用内排序方法对其分类,这样排序完的文件段称作归并段,然后将其写回外存中而在外存中形成了许多初始归并段。

第二阶段:对这些初始归并段采用某种归并方法,进行多遍归并,最后在外存上形成整个文件的单一归并段,也就完成了这个文件的外排序。

说明:外排序中的归并排序法和内排序中的归并法是类似的,都是由小单元逐渐归并成单元的过程,注意对比,加深理解。

归并排序算法分两个阶段:
1.初始归并段的形成
其过程是根据缓冲区大小,由文件输入(由外存读入内存)记录,当记录充满缓冲区后,选择最小的(以递增排序为例)记录输出(由内存写出到外存),其空缺位置由下一个输入记录来取代,输出的记录成为当前初始归并段的一部分。

如果新输入的记录不能成为当前生成的归并段的一部分,即它比生成的当前部分归并段最大的记录要小(如例1中的关键字11,比15要小,不可能出现在当前归并段中),它将等待生成下一个归并段时提供选择。

反复进行上述操作,直到所有新输入的记录关键字都小于最后输出记录的关键字时(如步骤9中的所有关键字都比83小,则以83为结尾的归并段生成完毕),就生成了一个初始归并段。

接着继续生成下一个归并段,直到全部记录都处理完毕为止。

下面通过例题来具体说明一下。

例1.设输入文件的各个记录的关键字为:
15,19,04,83,12,27,11,25,16,34,26,07,10,90,06, ... ...
假设内存缓冲区可容纳4个记录,成初始归并段。

如下表所示,给出了生成初始归并段过程中各步的缓冲区内容和输出结果。



1 2 3 4 5 6 7 8 9 10 11 12 13 ...
缓冲区内容15 15 15 11 1111111111 11 11 06 ......
19 19 19 19 25161616
16 16 16 16 ......
04 12 27 27 2727342626 26 26 26 ......
83 83 83 83 8383838307 10 90 90 ......
输出结果
04 12 15 19 25 27 34 83 07 10 11 06 ... ...
所生成的第一初始归并段所生成的第二初始归并段
... ...
初始归并段生成过程表(表中下划线数字即为生成下一归并段的候选数字)
2. k路归并
有了m个初始归并段(都是有序段),便可以进行k路归并了,即将k个初始归并段
归并产生一段,这样,m个初始归并段产生多个这样的段,然后对这些段再用同样的方法进行归并,如此往复,直到归并成一个段为止,这个段就是最后生成的归并段。

例2.一个文件,含有10000个记录,通过1.1中介绍的方法,得到10个初始归并段R1... R10,其中每一个段都含有1000个记录。

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

对初始归并段做两两归并:
R1,R2 R3,R4 R5,R6 R7,R8 R9,R10 R1’ R2’ R3’ R4’ R5’
R1” R2” R3”
R1’’’ R2’’’
R1’’’’(有序文件)
每次都由m个归并段得到个归并段,这种归并方法称为2-路归并。

若对上例进行5-路归并则有:
R1,R2,R3,R4,R5 R6,R7,R8,R9,R10
R1” R2”
R1’’’(有序文件)
·归并排序时间复杂度分析
m个初始归并段进行k路归并,归并的遍数为。


理的时间,而归并遍数为,所。

图1
(2)第一次比较胜出者5与第三个叶子结点10比较,10为败者,5为胜者,因而10替换到5的位置,5作为胜者向上一级比较,如图2
图2
(3)同理,依次比较其他各叶子结点,最终得到第一棵败者树为:
图3
K路归并的败者树的深度⎡log2k⎤在每次调整查找下一个具有最小关键字记录时,最多做⎡log2k⎤次关键字比较。

因此,利用败者树在K个记录中选择最小者,时间复杂度为O(log2k)。

说明:败者树和其他选择树的原理都是一样的,比如之前堆排序中的堆。

做法都是先用一个较大的时间复杂度将待排元素建成一棵满足一定要求的树,然后就可以从中取出一个满足要求的元素,并将新来的元素放在刚取出元素的位置上;这样只会在一点上对树的结构造成破坏而不会造成全局的破坏,因此只需花较小的时间复杂度进行局部调整即可将被破坏的结构恢复正常,无需从新建树。

局部调整即可恢复结构从而降低时间复杂度,这就是选择树的精髓。

数据结构就是这样,其实各种乱七八糟的结构都是表象,浮云,其背后的本质就那么一点,懂了这个之后,数据结构学习就会很轻松,最后祝大家考研愉快。

习题心选:
一、选择题:
1.外排序是指()
A.在外存上进行的排序方法。

B.不需要使用内存的排序方法。

C.数据量大,需要人工干预的排序方法。

D.排序前后数据在外存,排序时数据调入内存的排序方法。

2.文件有m个初始归并段,采用k路归并时,所需的归并遍数是()
A.log2k
B.log2m
C.log k
m D.
1 2 3 4 5 6 7 8 9 10 11
缓冲区内容10 12 13 21 21 21 16 16 16 16 20 20 20 20 20 8 8 8
15 15 15 15 30 30 30 30
25 25 25 25 25 25 25 10 10
输出结果10 12 13 15 20 21 25 30 8 10 16
第一初始归并段第二初始归并段
本题简单,每次从缓冲区中选出最小且比当前归并段最大的元素还要大的输出,空出来的位置读入新的关键字(参照例1 解法)。

2.答:内部排序中的归并排序是在内存中进行的归并排序,辅助空间为O(n)。

外部归并排序是将外存中的多个有序子文件合并成一个有序子文件,将每个子文件中记录读入内存后的排序方法可采用多种内排序方法。

外部排序的效率主要取决于读写外存的次数,即归并的趟数。

因为归并的趟数s=⎡log k m⎤,其中,m是归并段个数,k是归并路数。

增大k和减少m 都可减少归并趟数。

应用中通过败者树进行多(k)路平衡归并和置换-选择排序减少m,来提高外部排序的效率。

相关文档
最新文档