数据结构——外部排序

一、外部排序

1.1 基本思想

有时,待排序的文件很大,计算机内存不能容纳整个文件,这时候对文件就不能单纯的使用内部排序了,还得采取一些其他的策略。因此需要将待排序的记录存储到外存上,排序时再将数据一部分一部分地调用内存进行排序,在排序过程中需要多次进行内存和外存之间地交换,这种排序方法就成为外部排序。

文件通常是按块存储在磁盘上的,操作系统也是按块对磁盘上的信息进行读写的。因为磁盘读/写的机械动作所需的时间远远超过内存运算的时间,因此外部排序过程中的时间代价主要考虑访问磁盘的次数,即I/O次数。

外部排序常采用的排序方法是归并排序,这种归并方法由两个不同的阶段组成:

  1. 根据内存缓冲区大小,将外存中的文件分成若干个长度为数据结构——外部排序的子文件,依次读入内存并利用内部排序方法对它们排序,并将排序后得到的有序子文件重新写回外存,称这些有序子文件为归并串或顺串
  2. 对这些归并段进行逐趟归并,使归并段(有序子文件)逐渐由小到大,直至得到整个有序文件为止。

1.2 图解

(1)初始状态

(2)将数据结构——外部排序数据结构——外部排序分别存入输入缓冲区数据结构——外部排序和输入缓冲区数据结构——外部排序

(3)将输入缓冲区数据结构——外部排序和输入缓冲区数据结构——外部排序的数据进行递增排序

(6) 对剩余数据结构——外部排序块内存依次进行上述操作,总共需要进行数据结构——外部排序次读操作和数据结构——外部排序次写操作,得到初始归并段。

(7)第一次归并:读入归并段数据结构——外部排序和归并段数据结构——外部排序中的第一块磁盘(相对最小),进行排序:

(8)依次找出这两个输入缓冲区中最小元素,并将其移动到输出缓冲区中,当输出缓冲区满,则写入外存数据结构——外部排序

(9)继续找出这剩余元素中的最小元素,直到某一个缓冲区中空,则读入其所属归并段的后一个内存块的数据,并继续进行上述操作。直到两个缓冲区都空,且归并段数据结构——外部排序和归并段数据结构——外部排序中的元素全部读入内存,此时归并段数据结构——外部排序和归并段数据结构——外部排序就得到了一个有序的递增序列。

当输入缓冲区空了时:

输入归并段数据结构——外部排序的第二块内存

1.3 外部排序的开销

总时间开销 = 内部排序所需时间 + 内部归并所需时间 + 外部读写所需时间

1.4 优化:多路平衡归并

若改用数据结构——外部排序路归并排序,则只需数据结构——外部排序趟归并,外部排序时的总读/写次数便减至数据结构——外部排序。因此,增大归并路数,可减少归并趟数,进而减少总的磁盘数据结构——外部排序次数。

一般地,对数据结构——外部排序个初始归并段,做数据结构——外部排序路平衡归并,归并树可用严格数据结构——外部排序叉树(即只有度为数据结构——外部排序与度为数据结构——外部排序的结点的数据结构——外部排序叉树)来表示。第一趟可将数据结构——外部排序个初始归并段归并为数据结构——外部排序个归并段,以后每趟归并将数据结构——外部排序个归并段归并成数据结构——外部排序个归并段,直至最后形成一个大的归并段为止。数据结构——外部排序。可见,只要增大归并路数数据结构——外部排序,或减少初始归并段个数数据结构——外部排序,都能减少归并趟数数据结构——外部排序,进而减少读写磁盘的次数,达到提高外部排序速度的目的。

二、败者树

为了使内部归并不受数据结构——外部排序的增大的影响,引入了败者树。败者树是属性选择排序的一种变体,可视为一棵完全二叉树。

  1. 将每个归并段的第一个元素作为叶子结点加入败者树中

  2. 从左至右、从上往下的更新分支节点的信息:判断其左右子树的大小,除了根节点(最上面那个结点)记录冠军来自哪个归并段外,其余各分支节点记录的是失败者来自哪个归并段。
    在这里插入图片描述

  3. 取出最小的元素数据结构——外部排序后,从其所属的归并段中取出下一个元素数据结构——外部排序,依次与从叶子结点到根节点的各个结点所记录的败者信息进行对比。

可见,使用败者树后,内部归并的比较次数与数据结构——外部排序无关了。因此,只要内存空间允许,增大归并路数数据结构——外部排序将有效地减少归并树的高度,从而减少数据结构——外部排序次数,提高外部排序的速度。

值得说明的是,归并路数k并不是越大越好。归并路数数据结构——外部排序增大时,相应地需要增加输入缓冲区的个数。若可供使用的内存空间不变,势必要减少每个输入缓冲区的容量,使得内存、外存交换数据的次数增大。当数据结构——外部排序值过大时,虽然归并趟数会减少,但读写外存的次数仍会增加。

三、置换选择排序

使用选择置换排序,可以让每个初始段的长度不再受限于内存工作区大小,设内存工作区最多容纳数据结构——外部排序个数据:

  1. 将待排序文件数据结构——外部排序输入数据结构——外部排序个数据到内存工作区数据结构——外部排序
  2. 选择数据结构——外部排序中关键字最小的数据,输出到数据结构——外部排序中,并且用数据结构——外部排序记录该最小关键字
  3. 数据结构——外部排序不空,则从数据结构——外部排序中继续输入文件到数据结构——外部排序
  4. 数据结构——外部排序中选出比数据结构——外部排序更大的关键字的数据,输出并更新此最小关键字作为新数据结构——外部排序
  5. 重复2~4直到数据结构——外部排序中的每个关键字都>数据结构——外部排序为止,由此得到一个新的归并段
  6. 重复2~5,直到数据结构——外部排序空,得到全部初始归并段

(1)初始状态

四、最佳归并树

  1. 性质和构造完全相同于哈弗曼树
  2. 与哈弗曼树的区别:
    • 数据结构——外部排序叉树,其中数据结构——外部排序时:需要判断是否能满足构造完全数据结构——外部排序叉树,若不满足,则需要添加长度为数据结构——外部排序的“虚段”
      • 数据结构——外部排序,则能构成完全数据结构——外部排序叉树
      • 数据结构——外部排序,则说明需要添加数据结构——外部排序个虚段才能构成完全二叉树

参考文章

https://blog.csdn.net/JiangNan_1002/article/details/124306250

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年12月14日
下一篇 2023年12月14日

相关推荐