您的位置:首页 > 理论基础 > 数据结构算法

数据结构 之 外排序

2013-08-21 17:38 127 查看


如果数据存放在外存文件中,则需要考虑外存特点,采用外存文件排序技术,简称外排序(external sort)。
需要根据内存的大小,将外存中的数据文件划分成若干段,每次把其中一段读入内存并用内排序方法进行排序。这些已排序的段或有序的子文件称为顺串或归并段(run)。

外排序通常由两个相对独立的阶段组成:1、文件形成尽可能长的初始顺串 2、逐趟归并顺串,最后形成对整个数据文件的排列文件

置换选择排序

从输入文件读取一定数量的记录进入输入缓冲区;然后向内存工作区放入待排序记录并进行排序;记录被处理后,写到输出缓冲区;当输出缓冲区写满的时候,把整个缓冲区写回到外存文件。当输入缓冲区为空时,再次从外存文件中读取下一块记录。

在内存中维护一个大小为m的最小堆,重复一下步骤:(如果新加入的数比刚才输出的最小值还小,则不参与排序,这样才能保证顺串至少为m大小,平均情况下长度可为2m)

(1)把具有最小关键码值的记录(根结点)送到输出缓冲区;

(2)设R是输入缓冲区中的下一条记录。判断R的关键码值是否大于刚刚输出的关键码值,

① 如果是,那么把R放到根结点。

② 否则,

(a) 使用数组中LAST位置的记录代替根

结点;

(b) 把R放到LAST位置;

(c) 设置LAST= LAST - 1。

(3)重新排列堆,筛出根结点。

二路外排序

即首先把数据文件划分成若干段,用有效的内排序方法对文件的各段进行初始排序以形成顺串;然后把这些顺串逐趟合并,直至变为一个顺串为止。
优化:创建尽可能大的初始串或者根据顺串的长度,创建huffman树优化归并次序。

多路归并——选择树

k路归并是每次将k个顺串合并成一个排好序的顺串。一般情况下,对m个初始顺串进行k路归并时归并趟数为logkm。增加每次归并的顺串数量k可以减少归并趟数。

赢者树

完全二叉树,采用数组作为存储结构。
---选手或叶结点用数组L[1...n]表示,内部结点用数组B[1...n-1]表示
---数组中实际存放的是数组L的索引

---每个节点保存的是它的子节点比较,获胜的那一个的索引
优点:如果一个选手L[i]的分数值改变了,可以很容易地修改这棵赢者树。只需要沿着从L[i]到根结点的路径修改二叉树,而不必改变其它比赛的结果。

败者树

o败者树是赢者树的一种变体。在败者树中,用父结点记录其左右子结点进行比赛的败者,而让获胜者去参加更高阶段的比赛。
o另外,根结点处加入一个结点来记录整个比赛的胜者。
优点:失败的节点对其它节点的影响少,采用败者树是为了简化重构的过程,如果新加入一个值,与它的兄弟节点比较输了,只用改变一个节点

o败者树方法:对k个顺串进行归并,初始化包含k个选手的败者树,需要时间O(k),把最小值输出到缓冲区后,读入一个新值并重构败者树的时间为O(logk),那么产生一个大小为n的顺串的总时间缩短为O(k+n×logk),近似于O(n×logk)
o显然败者树归并效率更高

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: