选择树——胜者树&败者树

选择树:能够记载上一次比较所获得的知识的数据结构。完全二叉树,分为胜者树和败者树两种。


胜者树:每个父结点表示它的两个子女中比赛胜利的结点,胜利的结点继续向上比赛根结点记录了最后的胜者

           重构:从缓冲区中再取出一个结点,将其与自己的兄弟结点比较,如果胜,则继续向上比较否则,其兄弟代替它继续向上比较

败者树:每个父结点表示它的两个子女中比赛失败的结点,胜利的结点继续向上比赛根结点记录的是与最后的胜者比较后失败者,所以需要添加 一个结点来表示最后的胜者

           重构:从缓冲区中再取出一个结点,将其与自己的父亲结点进行比较,如果胜,则继续向上比较,否则,其父亲代替它继续向上比较

           注:叶子结点记录的是真实的值,而非叶结点记录了相应的结点标号,不是实际的数据

                 胜者树和败者树的复杂度相同,只是败者树的重构过程比较简单


外部排序——归并

有一个很大的记录,将其平均分为几小部分,假设分为了A、B、C、D、E、F、G七个文件,每个文件有足够的内存可以容纳

将这七个文件分别放入内存,进行内排序,形成七个归并段

假设采用三路归并:将3个归并段归并为一个,通过反复输出关键字最小的记录完成

每次归并的时候,不需要将所有的记录都放入内存,只要取每个文件的第一个记录即可。

完成第一次归并后,七个归并段将减少为三个归并段

进行第二次归并,三个归并段就可以归并为一个归并段,完成排序

在此期间,文件可用于作为缓冲区


败者树与归并

假设有m个初始归并段,进行k路归并排序,则磁盘读写的次数为|logkm|(k是log的底数)

(这个过程与二叉树的高度是相同的,总共有m个元素,每次k个不断归为1,到顶时m个归为1)

可见,当k越大的时候,读写的次数越小。

一次归并的算法复杂度:O((n-1)log2k)(n表示参与一次归并时的所有归并段中的元素个数)

posted @ 2013-12-04 14:51  huapyuan  阅读(1627)  评论(0)    收藏  举报