数据结构——(11)外部排序

一、外部信息的获取

1、磁带信息的读取

使用时,将磁带盘放在磁带机上,驱动器控制磁带盘转动,带动磁带向前移动,通过读/写头就可以读出磁带上的信息或者把信息写入磁带中。磁带不是连续运转的设备,而是一种启停设备,可以根据读/写的需要随时启动和停止,所以,在磁带相邻的两组字符组(记录)之间要留一空白区,称之为间隙。

    在磁带上读写一块信息所需的时间由两部分组成:

T(I/O)=ta+n·tw

  • ta为延迟时间,读/写头到达传输位置所在物理块起始位置所需时间

  • tw为传输一个字符的时间

2、磁盘信息的读取

盘片装在一个主轴上,并绕主轴高速旋转,首先要找到柱面,移动臂使磁头移动在所需柱面上(成为定位或查找);然后等待要访问的信息转到磁头之下;最后读/写所需信息。磁盘可以是单片的,也可以由若干盘片组成盘组,且每一片上有两个面。由于磁盘上读/写信息的时间花在巡查时间上,所以在磁盘上存放信息时应将相关的信息放在同一柱面或邻近柱面上,以求在读/写信息时尽量减少磁头来回移动的次数,以避免不必要的查询时间。

T(I/O)=t(seak)+t(la)+n·t(wm)

  • t(seak)为寻查时间,即读/写定位的时间

  • t(la)为等待时间,即等待信息块的初始位置旋转到读写头下的时间

  • t(wm)为传输时间

二、外部排序

1、定义

外部排序指待排序的内容庞大,内存一次装不下,需要将内容存放在外存的排序。外部排序进行排序事,将内容一部分一部分地调入内存进行排序,因此需要在外存和内存之间进行多次交换。

2、外部排序的方法

外部排序通常采用归并排序,分为两个阶段:

  • 根据缓冲区大小对待排序的文件进行划分,划分成若干长度为 l 的子文件,然后依次读入内存利用内部排序算法进行排序,将排序后的有序子文件写回外存,这些有序子文件称为归并段或顺串;

  • 对归并段进行逐趟归并直至得到整个有序文件。

3、实现外部排序的两个过程

  1. 将整个初始文件分为多个初始归并段;

  2. 将初始归并段进行归并,直至得到一个有序的完整文件

4、时间组成

(1)、内部排序所需要的时间

(2)、外存信息读写所需要的时间 

与归并的趟数有关 

k要大 —– 传统方法 会引起内部归并时间增大 

  • 赢者树

  • 败者树(目的:提高在k个归并串中当前值中找到最小值的效率)

m要小 —– 置换选择排序

Huffman(归并的顺序,对外存的I/O次数降到最低)

为了提高整个外部排序的效率,分别从以上两个方面对外部排序进行了优化:

  • 在实现将初始文件分为 m 个初始归并段时,为了尽量减小 m 的值,采用置换-选择排序算法(内部使用败者树实现),可实现将整个初始文件分为数量较少的长度不等的初始归并段。

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

5、优化递进顺序

  • 二路归并【因为硬盘的读写速度比内存要慢的多,按照以上这种方法,每个数据都从硬盘读了三次,写了三次,要花很多时间。考虑K路】

  • 多路归并【K不是越大越好,因为K越大,在内部排序需要的时间越长,效率低。考虑减少初始顺串的数量M】

  • 置换选择算法【可以用败者树和堆排序实现,得到多个长度不等的初始归并段,如何设置它们的归并顺序,可以使得对外存的访问次数降到最低? 考虑结合哈夫曼树】

  • 最佳归并树(置换选择算法+哈夫曼树+多路归并+败者树)

Guess you like

Origin blog.csdn.net/qq_41819893/article/details/121324483