外部排序

合集下载

排序之外部排序

排序之外部排序

排序之外部排序有时,待排序的⽂件很⼤,计算机内存不能容纳整个⽂件,这时候对⽂件就不能使⽤内部排序了(这⾥做⼀下说明,其实所有的排序都是在内存中做的,这⾥说的内部排序是指待排序的内容在内存中就可以完成,⽽外部排序是指待排序的内容不能在内存中⼀下⼦完成,它需要做内外存的内容交换),外部排序常采⽤的排序⽅法也是归并排序,这种归并⽅法由两个不同的阶段组成:1、采⽤适当的内部排序⽅法对输⼊⽂件的每个⽚段进⾏排序,将排好序的⽚段(成为归并段)写到外部存储器中(通常由⼀个可⽤的磁盘作为临时缓冲区),这样临时缓冲区中的每个归并段的内容是有序的。

2、利⽤归并算法,归并第⼀阶段⽣成的归并段,直到只剩下⼀个归并段为⽌。

例如要对外存中4500个记录进⾏归并,⽽内存⼤⼩只能容纳750个记录,在第⼀阶段,我们可以每次读取750个记录进⾏排序,这样可以分六次读取,进⾏排序,可以得到六个有序的归并段,如下图:每个归并段的⼤⼩是750个记录,记住,这些归并段已经全部写到临时缓冲区(由⼀个可⽤的磁盘充当)内了,这是第⼀步的排序结果。

完成第⼆步该怎么做呢?这时候归并算法就有⽤处了,算法描述如下:1、将内存空间划分为三份,每份⼤⼩250个记录,其中两个⽤作输⼊缓冲区,另外⼀个⽤作输出缓冲区。

⾸先对Segment_1和Segment_2进⾏归并,先从每个归并段中读取250个记录到输⼊缓冲区,对其归并,归并结果放到输出缓冲区,当输出缓冲区满后,将其写道临时缓冲区内,如果某个输⼊缓冲区空了,则从相应的归并段中再读取250个记录进⾏继续归并,反复以上步骤,直⾄Segment_1和Segment_2全都排好序,形成⼀个⼤⼩为1500的记录,然后对Segment_3和Segment_4、Segment_5和Segment_6进⾏同样的操作。

2、对归并好的⼤⼩为1500的记录进⾏如同步骤1⼀样的操作,进⾏继续排序,直⾄最后形成⼤⼩为4500的归并段,⾄此,排序结束。

外部排序处理大规模数据的外部存储排序算法

外部排序处理大规模数据的外部存储排序算法

外部排序处理大规模数据的外部存储排序算法在计算机科学中,外部排序是指对大规模数据进行排序时所采用的一种排序方式。

由于计算机内存的有限性,当数据量超过内存容量时,无法一次性加载到内存中进行排序。

因此,我们需要将数据分割成多个较小的块,在磁盘上进行排序,然后再将排序好的块逐个合并成最终有序的结果。

外部存储排序算法是一种用于处理大规模数据的高效排序算法,它充分利用了磁盘I/O的特性,以提高排序的效率和整体性能。

下面将介绍两种常见的外部存储排序算法:归并排序和多路归并排序。

一、归并排序归并排序是一种常见的排序算法,它也被广泛应用于外部存储排序中。

其基本思想是将待排序的数据划分为若干个子序列,分别进行内部排序,然后再将排好序的子序列进行合并,最终得到全局有序的结果。

归并排序的具体步骤如下:1. 将大规模数据划分成多个块并加载到内存中。

2. 对每个块进行内部排序,可以选择快速排序、堆排序等高效的排序算法。

3. 将排好序的块写入磁盘,同时将下一块数据加载到内存中。

4. 重复步骤2和步骤3,直到所有块都排序完毕。

5. 对排好序的块进行多路归并,生成最终的有序结果。

归并排序的时间复杂度为O(n log n),其中n表示待排序数据的总量。

它的优势在于适用于处理大规模数据,但由于需要频繁进行磁盘I/O,因此效率较低。

二、多路归并排序多路归并排序是一种改进版的归并排序算法,它能够同时合并多个有序的子序列,并生成一个更大的有序序列。

与传统的两路归并排序不同,多路归并排序可以合并超过两个的子序列。

多路归并排序的核心思想是使用最小堆来管理各个子序列的当前元素,每次从堆中选择最小的元素输出,并将其所在的子序列的下一个元素加入堆中。

通过不断地选择最小的元素,最终实现多路归并排序。

多路归并排序的具体步骤如下:1. 将大规模数据划分成多个块并加载到内存中。

2. 对每个块进行内部排序,可以选择快速排序、堆排序等高效的排序算法。

3. 将块的首个元素创建最小堆,并将最小堆中的元素输出到磁盘。

第11章 外部排序

第11章 外部排序
• 改进:采用胜者树或者败者树,从 K 个元素中挑选 一个最小的元素仅需 log2k 次比较,这时总的时间耗 费将下降为: log2m × ( n - 1 ) × tmg
多路平衡归并的实现
二、胜者树及其使用 4路平衡归并
1 5
2 5
1234567 5 5 9 5 7 29 9
3 9
4
5
6
7
5
7
29
91
71
59


5

7



多路平衡归并的实现
二、胜者树及其使用 4路平衡归并
1
9
123
9 12 9
2
3
12
9
4567 16 12 29 9
4
5
6
7
16
12
29
9

5
7
29
9

16
12
38
22

49
25
57
47
52
84
66
48

78
91
71
59


5

7

9


多路平衡归并的实现
•采用胜者树,从 K 个元素中挑选一个最小的元素仅需 log2m × ( n - 1 ) × tmg 即内部归并时间与k无关, K 增大,归并趟数logkm减少 ,读写外存次数减少,外排总时间减少。
b[0]
b[1] b[2]
b[3]
5
7
29
9

5
7
29
9

第十一章 外部排序

第十一章  外部排序
.
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
§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
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,…

外部排序

外部排序

FI
WA
FO
23
实例:输入文件FI中记录关键字为:51、49、39、46、38、29 、14、61、15、30、1、48、52、3、63、27、4、13、89、 24、46、58、33、76,假定使用的内存可容纳 6 个记录,利 用置换-选择分类法产生初始合并段。 51 38 15 52 4 46 49 39 46 29 14 61 30 1 48 3 63 27 13 89 24 58 33 76 29 38 39 46 49 51 14 61 15 30 1
90 92 97
11
调整败者树的方法
以在b[4]补充15为例
5 4 2 5 2与5比较 4 2 4与2比较
0 6 90 0
1
3 4与3比较
10
1
9 2
20 3
15 6
4
8 5
12 6
调整败者树的方法: 将新补充的结点与其双亲结点比较, 败者留在该双亲结点,胜者继续向上直至树根的双亲
12
建败者树的过程
51 49 39 46 38 29
FI
WA
FO
19
实例:输入文件FI中记录关键字为:51、49、39、46、38、29 、14、61、15、30、1、48、52、3、63、27、4、13、89、 24、46、58、33、76,假定使用的内存可容纳 6 个记录,利 用置换-选择分类法产生初始合并段。 51 38 15 52 4 46 49 39 46 29 14 61 30 1 48 3 63 27 13 89 24 58 33 76 29 51 49 39 46 38 14
[数据结构] (依据:败者树为完全二叉树) 主:b[0.. k] b[0.. k-1]——k个叶结点 ,存放k个输入归并段中当前 参加归并的记录(缓冲区) b[k]——虚拟记录,该关键字取可能的最小值minkey 辅:ls[0.. k-1] ——不含叶结点的败者树 存放最后胜出的编号(ls[0])以及所记录的败者编号 [处理步骤] 建败者树ls[0.. k-1] 重复下列操作直至k路归并完毕

外部排序归并排序与多路归并

外部排序归并排序与多路归并

外部排序归并排序与多路归并外部排序是一种针对大规模数据进行排序的算法,常用的外部排序算法包括归并排序和多路归并。

本文将对外部排序、归并排序和多路归并进行详细介绍和比较。

一、外部排序外部排序是指当数据量过大,无法一次性加载到内存中进行排序时,需要使用外部存储器(如硬盘)进行排序的一种算法。

外部排序主要包括两个阶段:排序阶段和归并阶段。

排序阶段将大数据划分为若干个能够加载到内存的小块,对每个小块进行排序;归并阶段将排好序的小块按照规定的方式进行合并和排序,最终得到整个数据的有序结果。

二、归并排序归并排序是一种分治策略的排序算法,它将待排序的数据分成若干个小块,然后分别对每个小块进行排序,最后再将排序好的小块进行合并,得到整个数据的有序结果。

归并排序采用递归的思想,先对每个小块进行排序,再进行小块的合并。

1. 归并排序算法步骤:- 将待排序的数据分成两个子问题,分别对左右两个子问题进行归并排序;- 当左右两个子问题均排序完成后,将两个有序子数组进行合并得到最终的有序结果。

2. 归并排序的优缺点:- 优点:稳定,时间复杂度为O(nlogn),适用于大规模数据的排序;- 缺点:需要额外的空间进行数据的合并,空间复杂度为O(n)。

三、多路归并多路归并是对归并排序的改进和扩展,它将归并排序的两路归并扩展为多路归并。

多路归并可以减少磁盘I/O的次数,提高排序效率。

1. 多路归并算法步骤:- 将待排序的数据划分为多个块;- 对每个块进行排序,得到有序子块;- 将有序子块进行多路归并,得到最终的有序结果。

2. 多路归并的优缺点:- 优点:减少磁盘I/O次数,提高排序效率;- 缺点:增加了算法的复杂性,不适用于小规模数据的排序。

四、归并排序与多路归并的对比归并排序和多路归并都是外部排序的经典算法,它们在处理大规模数据时具有一定的优势。

但在具体应用时,需要根据实际情况选择合适的算法。

1. 时间复杂度:归并排序和多路归并的时间复杂度都为O(nlogn),其中n为待排序数据的大小。

数据结构与算法系列——排序(15)_外部排序

数据结构与算法系列——排序(15)_外部排序

数据结构与算法系列——排序(15)_外部排序核⼼部分1. 实现外部排序的两个过程:1. 将整个初始⽂件分为多个初始归并段;2. 将初始归并段进⾏归并,直⾄得到⼀个有序的完整⽂件;2. 时间组成:1. 内部排序所需要的时间2. 外存信息读写所需要的时间(关键)与归并的趟数有关k要⼤ —– 传统⽅法会引起内部归并时间增⼤赢者树败者树(⽬的:提⾼在k个归并串中当前值中找到最⼩值的效率)m要⼩ —– 置换选择排序Huffman(归并的顺序,对外存的I/O次数降到最低)3. 内部归并所需要的时间 3. 为了提⾼整个外部排序的效率,分别从以上两个⽅⾯对外部排序进⾏了优化:1. 在实现将初始⽂件分为 m 个初始归并段时,为了尽量减⼩ m 的值,采⽤置换-选择排序算法(内部使⽤败者树实现),可实现将整个初始⽂件分为数量较少的长度不等的初始归并段。

2. 同时在将初始归并段归并为有序完整⽂件的过程中,为了尽量减少读写外存的次数,采⽤构建最佳归并树的⽅式(哈夫曼树实现),对初始归并段进⾏归并(败者树实现),⽽归并的具体实现⽅法是采⽤败者树的⽅式。

4. 优化递进顺序:1. ⼆路归并【因为硬盘的读写速度⽐内存要慢的多,按照以上这种⽅法,每个数据都从硬盘读了三次,写了三次,要花很多时间。

考虑K路】2. 多路归并【K不是越⼤越好,因为K越⼤,在内部排序需要的时间越长,效率低。

考虑减少初始顺串的数量M】3. 置换选择算法【可以⽤败者树和堆排序实现,得到多个长度不等的初始归并段,如何设置它们的归并顺序,可以使得对外存的访问次数降到最低? 考虑结合哈夫曼树】4. 最佳归并树(置换选择算法+哈夫曼树+多路归并+败者树)5 胜者树 & 败者树 & 堆排序发展历史 堆:其实⼀开始就是只有堆来完成多路归并的,但是⼈们发现堆每次取出最⼩值之后,把最后⼀个数放到堆顶,调整堆的时候,每次都要选出⽗节点的两个孩⼦节点的最⼩值,然后再⽤孩⼦节点的最⼩值和⽗节点进⾏⽐较,所以每调整⼀层需要⽐较两次。

外部排序分析

外部排序分析

外部排序分析当对数据记录量巨⼤的数据⽂件进⾏排序时,由于受到内存容量的限制,⽆法将所有数据记录⼀次全部读⼊到内存进⾏。

排序过程中需要多次进⾏内、外存之间的数据交换。

利⽤外存对数据⽂件进⾏排序称为外部排序。

外部排序最基本的⽅法是归并。

这种⽅法是由两个相对独⽴的阶段组成:①按内存(缓冲区)的⼤⼩,将n个记录的数据⽂件分成若⼲个长度为l的段或⼦⽂件,依次读⼊内存并选择有效的内部排序⽅法进⾏排序;然后将排好序的有序⼦⽂件重新写⼊到外存。

⼦⽂件称为归并段或顺串。

②采⽤归并的办法对归并段进⾏逐趟归并,使归并段的长度逐渐增⼤,直到最后合并成只有⼀个归并段的⽂件—排好序的⽂件。

1 外部排序的简单⽅法归并排序有多种⽅法,最简单的就是2-路归并。

设有⼀个磁盘上的数据⽂件,共有100,000个记录(A1, A2,…,A100000),页块长为200个记录,供排序使⽤的缓冲区可提供容纳1000个记录的空间,现要对该⽂件进⾏排序,排序过程可按如下步骤进⾏:第⼀步:每次将5个页块(1000个记录)由外存读到内存,进⾏内排序,整个⽂件共得到10个初始顺串R1~R10 (每⼀个顺串占5个页块),然后把它们写回到磁盘上去。

第⼆步:然后两两归并,直到成为⼀个有序⽂件为⽌。

由图可知,每趟归并由m个归并段得到┌m/2┐个归并段。

2 外排序的时间分析外排序的时间消耗⽐内排序⼤得多,原因是:●外排序的数据量(记录)⼀般很⼤;●外排序涉及到内、外存之间的数据交换操作;●外存的操作速度远远⽐内存中的操作慢。

外排序的总时间由三部分组成:外排序的时间=产⽣初始归并段的时间(内排序)m×tis+I/O操作的时间d×tio+内部归并的时间s×utmg其中:m:初始归并段数⽬;tis:得到⼀个归并段的内排序时间;d:总的读、写次数;tio:⼀次读、写的时间;s:归并的趟数;utmg:对u个记录进⾏⼀趟内部归并排序的时间。

⼀般地,tio>>tis,tio>>tmg,tio⽽取决于所⽤外存,因此,影响外排序效率的主要原因是内、外存之间数据交换(读、写外存)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.通过“归并”,逐步扩大(记录的)有序子序列的长度,直至外存中整个记录 序列按关键字有序为止。
2 外部排序的方法
例如:假设有一个含10,000个记录的磁盘文件,而当前所用的计算机一次只能 对1,000个记录进行内部排序,则首先利用内部排序的方法得到10个初始归并 段,然后进行逐趟归并。
假设进行2 路归并(即两两归并),则第一趟由10个归并段得到5个归并段;
tIO值取决于外存,远远大于tIS和tmg。 外部排序的时间取决于读写外存的次数d。
2 外部排序的方法
例如:若对上述例子采用2 路归并,则只需进行4趟归并, 外排所需总的时间: 10*tIS+500*tIO+4*1000*tmg
若对上述例子采用5 路归并,则只需进行2趟归并,总的访问外存的次数为 100+2 100=300次
一般情况下,假设待排记录序列含 m 个初始归并段,外排时 采用 k 路归并,则归并趟数s= logkm ,显然,随着k的增大 或m的减小,归并的趟数将减少,因此对外排而言,通常采用 多路归并。k 的大小可选,但需综合考虑各种因素。
3 多路平衡归并的实现
一、多路平衡归并ቤተ መጻሕፍቲ ባይዱ性质:
•分析: m 个初始归并段,外排时采用 k 路归并,则归并趟数为 logkm , K 大, 趟数减少,读写记录的总数将减少。但 K 大,会使内部归并时间tmg增大?。
• 改进:采用胜者树或者败者树,从 K 个元素中挑选一个最小的元素仅需 log2k 次 比较,这时总的时间耗费将下降为: log2m × ( n - 1 ) × tmg
•磁带信息的表示:
一种磁化方向、代表1 另一种磁化方向,代表0
01001001 10101111
•磁带文件的组织:
1、外存信息的存取
读写头
记录 1
记录 2
记录 3
IRG(Inter Record Gap)记录间隙
IRG:0.5~0.75 inch,带来的问题是什么? 磁带的利用率下降。 例如: 密度 1600 byte per inch 的带。设每个记录有 80 byte ,如果 IRG= 0.75 inch ; 带的利用率? 记录所用:(80/1600) = 0.005 inch IRG所用: 0.75 inch 利用率= 0.005/(1+0.75)= 1/16 必须改进磁带的利用率 !
• 盘文件的读写时间:T i/o = tseck + tla + n×twm tseck (0.1秒) :找道时间; tla (<25豪秒) :等待时间twm (105个字符/秒):传输时间/ 字符,n 字符数。
2 外部排序的方法
外部排序的基本过程 由相对独立的两个步骤组成: 1.按可用内存大小,利用内部排序方法,构造若干个记录的有序子序列写入外存,通 常称这些记录的有序子序列为 “归并段”;
2、常用外存:
1) 磁带:由磁带介质、读、写磁头、驱动器、接收盘和原始盘 组成。便宜、可反复使用、是一种顺序存取设备。查找费时、 速度慢(尤其是查找末端记录时)
磁带机走向
原.
始 盘
读写 出入 头头
.
接 收

可靠读写区 v
记录
记录
记录
1
2
3
t
IRG(Inter Record Gap)记录间隙
1、外存信息的存取
1)求得10个初始归并段需访问外存100次; 2)每进行一趟归并需访问外存100次; 3)总计访问外存 100 + 4 100 = 500次
2 外部排序的方法
外排总的时间还应包括内部排序所需时间和逐趟归并时进行内部归并的时间
外部排序总时间=产生初始归并段的时间 m*tIS +外存信息读写时间 d*tIO +内部归并所需时间 s*utmg
•磁带文件的读写时间:T i/o = ta + n×tw ta 延迟时间:读写头到达相应的物理块的起始位置的时间。 tw 读/写一个字符的时间; n 字符数。
由于磁带是顺序存取设备,在读一个记录时,必须先顺序检索,直到所需信息通 过读写头时才能得到。因此检索速度很慢。 磁带主要用于存储顺序存取的大量数据。
3 多路平衡归并的实现
设从 k 个元素中挑选一个最小的元素需 ( k-1) 次比较。 每次比较耗费的时间代价为 tmg, 在进行 k 路平衡归并时,要得到m个初始归并段,则内部归并过程中进行的比较的总的次数 为:
logkm × ( k - 1 ) × ( n - 1 ) × tmg = log2m ×( k - 1 ) / log2k × ( n - 1 ) × tmg
1、外存信息的存取
2)磁盘:
• 结构:由磁盘驱动器、读、写磁头、活动臂、盘片(磁道、扇 区)、旋转主轴构成。速度快、容量大、直接存取设备。
2)磁盘:
•种类:固定头磁盘、活动头磁盘
•固定头磁盘:每个磁道都有一个磁头(速度快) •活动头磁盘:每个盘面共用一个磁头,增加了找道的时 间,应用广泛。
• 柱面:各盘面的直径相同的磁道的总和。 • 物理位置:柱面号、磁道号、块(扇区号)
1、外存信息的存取
•磁带文件的组织的改进:
块1
块2
块3
IBG(Inter Block Gap)块间间隙
IBG:.5~.75 inch,带来的好处是磁带的利用率上升 如上例:设 每一块包含20个记录 每一块所占 20 × 80/1600 =1 inch
利用率= 1/1+0.75 = 57%
1、外存信息的存取
外部排序
1、外存信息的存取 2、外部排序的方法 3、多路平衡归并的实现 4、置换-选择排序 5、最佳归并树
1、外存信息的存取
1、外部排序: 待排序的记录数量巨大,无法一次调入内存,只能驻留在外存上(磁带、磁
盘、CD-ROM)上。不能使用内部排序的方法进行排序。否则将引起频繁访问外 存。
外部排序主要的时间开销用在信息的内、外存交换上,所以减少 I/O 时间成 为要解决的主要问题。
第二趟由 5 个归并段得到3个归并段; 第三趟由 3 个归并段得到2个归并段; 最后一趟归并得到整个记录的有序序列。
2 外部排序的方法
分析上述外排过程中访问外存(对外存进行读/写)的次数:
假设“数据块”的大小为200,即每一次访问外存可以读/写200个记录。 则对于10,000个记录,处理一遍需访问外存100次(读和写各50次)。
相关文档
最新文档