选择树——胜者树&败者树
选择树:能够记载上一次比较所获得的知识的数据结构。完全二叉树,分为胜者树和败者树两种。
胜者树:每个父结点表示它的两个子女中比赛胜利的结点,胜利的结点继续向上比赛。根结点记录了最后的胜者。
重构:从缓冲区中再取出一个结点,将其与自己的兄弟结点比较,如果胜,则继续向上比较,否则,其兄弟代替它继续向上比较。
败者树:每个父结点表示它的两个子女中比赛失败的结点,胜利的结点继续向上比赛。根结点记录的是与最后的胜者比较后失败者,所以需要添加 一个结点来表示最后的胜者。
重构:从缓冲区中再取出一个结点,将其与自己的父亲结点进行比较,如果胜,则继续向上比较,否则,其父亲代替它继续向上比较。
注:叶子结点记录的是真实的值,而非叶结点记录了相应的结点标号,不是实际的数据
胜者树和败者树的复杂度相同,只是败者树的重构过程比较简单
外部排序——归并
有一个很大的记录,将其平均分为几小部分,假设分为了A、B、C、D、E、F、G七个文件,每个文件有足够的内存可以容纳
将这七个文件分别放入内存,进行内排序,形成七个归并段
假设采用三路归并:将3个归并段归并为一个,通过反复输出关键字最小的记录完成
每次归并的时候,不需要将所有的记录都放入内存,只要取每个文件的第一个记录即可。
完成第一次归并后,七个归并段将减少为三个归并段
进行第二次归并,三个归并段就可以归并为一个归并段,完成排序
在此期间,文件可用于作为缓冲区
败者树与归并
假设有m个初始归并段,进行k路归并排序,则磁盘读写的次数为|logkm|(k是log的底数)
(这个过程与二叉树的高度是相同的,总共有m个元素,每次k个不断归为1,到顶时m个归为1)
可见,当k越大的时候,读写的次数越小。
一次归并的算法复杂度:O((n-1)log2k)(n表示参与一次归并时的所有归并段中的元素个数)

浙公网安备 33010602011771号