外部排序

学习一个知识的步骤:

  1. 什么是外部排序? What?
  2. 为什么要使用外部排序? Why?
  3. 怎样使用外部排序? How?

1.什么是外部排序?

外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。


2. 为什么要使用外部排序?

文件数据量太大,而内存无法满足其需要。


3. 怎样使用外部排序?

一般情况下外部排序分为两个步骤:预处理和合并排序。
常用的解决方法就是多路归并排序算法。

处理过程
1.按可用内存的大小,把外存上含有n个记录的文件分成若干个长度为L的子文件,把这些子文件依次读入内存,并利用有效的内部排序方法对它们进行排序,再将排序后得到的有序子文件重新写入外存。

2.对这些有序子文件逐趟归并,使其逐渐由小到大,直至得到整个有序文件为止。

举例说明:
假设有一个含1000G记录的文件,但是内存只有100G大小,首先通过10 次内部排序得到10 个初始归并段R1~R10 ,其中每一段都含100G 个记录。然后对它们作如图所示的两两归并,直至得到一个有序文件为止:
这里写图片描述

接下来说一下·多路归并排序算法:
过程大致为:
1):首先将k个归并段中的首元素关键字依次存入b[0]–b[k-1]的叶子结点空间里,然后调用CreateLoserTree创建败者树,创建完毕之后最小的关键字下标(即所在归并段的序号)便被存入ls[0]中。然后不断循环:

2)把ls[0]所存最小关键字来自于哪个归并段的序号得到为q,将该归并段的首元素输出到有序归并段里,然后把下一个元素关键字放入上一个元素本来所 在的叶子结点b[q]中,调用Adjust顺着b[q]这个叶子结点往上调整败者树直到新的最小的关键字被选出来,其下标同样存在ls[0]中。循环这个 操作过程直至所有元素被写到有序归并段里。
这里写图片描述

这里写图片描述

多路归并排序算法、从2路到多路(k路),增大k可以减少外存信息读写时间,但k个归并段中选取最小的记录需要比较k-1次, 为得到u个记录的一个有序段共需要(u-1)(k-1)次,若归并趟数为s次,那么对n个记录的文件进行外排时,内部归并过程中进行的总的比较次数为 s(n-1)(k-1),也即(向上取整)(logkm)(k-1)(n-1)=(向上取整)(log2m/log2k)(k-1)(n-1),而(k- 1)/log2k随k增而增因此内部归并时间随k增长而增长了,抵消了外存读写减少的时间,这样做不行,由此引出了“败者树”tree of loser的使用。

败者树是完全二叉树, 因此数据结构可以采用一维数组。其元素个数为k个叶子结点、k-1个比较结点、1个冠军结点共2k个。ls[0]为冠军结点,ls[1]–ls[k- 1]为比较结点,ls[k]–ls[2k-1]为叶子结点(同时用另外一个指针索引b[0]–b[k-1]指向)。另外bk为一个附加的辅助空间,不属于败者树,初始化时存着MINKEY的值

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值