赞
踩
外部排序技术之多路归并
1.外部排序概述
外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装人内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行归并排序。
2. 多路归并的实现
2.1 胜者树
胜者进入下一轮,直至决出本次比赛的冠军。决出冠军之后,充分利用上一次比赛的结果,使得更快地挑出亚军、第三名 …… 。
示例:我们这里以四路归并为例,假设每个归并段已经在输入缓冲区如下图。
每路的第一个元素为胜利树的叶子节点,(5,7)比较出5胜出成为其根节点,(29,9)比较9胜出成为其根节点,一次向上生成一棵胜利树,然后我们可以得出5为冠军,将第一路归并段的元素5放入输出缓冲区,然后将第一路第二个元素放到胜利树中如下:
由第一次得到的胜利树知,我们这里只改变了第1路的叶子节点,所有根节点7的右子树不用再比较,(16,7)比较7胜出,然后7和右子树的胜利者比较7胜出得到亚军,只进行了2次比较。
所以我们知道:
决出第一名需比较: k - 1 次
决出第二名需比较: 次
决出第三名需比较: 次 .............
2.2 败者树
与胜利树相类似,败者树是在双亲节点中记录下刚刚进行完的这场比赛的败者,让胜者去参加更高一层的比赛。
示例:我们这里以四路归并为例,假设每个归并段已经在输入缓冲区如下图。
每路的第一个元素为胜利树的叶子节点,(5,7)比较出5胜出7失败成为其根节点,(29,9)比较9胜出29失败成为其根节点,胜者(5,9)进行下次的比赛7失败成为其根节点5胜出输出到输出缓冲区。由第一路归并段输出,所有将第一路归并段的第二个元素加到叶子节点如下图:
加入叶子节点16进行第二次的比较,跟胜利树一样,由于右子树叶子节点没有发生变化其右子树不用再继续比较。
复杂度都为N*logN
转自:http://blog.chinaunix.net/uid-25324849-id-2182916.html(外部排序技术)
位图法:
上面的方法简单来说如下:
1、数据切分成k个小文件,每个小文件n长度,即n*k=海量的数据
2、先将每个小文件排序(需要内存足够存放小文件n的数据量)
3、每个小文件排序完后,进行多路归并,完成排序(需要内存足够存放k的数据量)
假设数据量很大,但是内存很小,此时连归并排序都无法运行
位图法介绍(参照july海量数据处理.pdf && 编程珠玑)
例:给10^7个数据量的磁盘文件排序,每个数据小于10^7,内存1M限制
解:1、创建10^7个位大小,初始化每位为0
2、读取文件数据i,则将第i位置为1
3、从最小位读取每位,如为1,输出对应的数。最终即为排序完的序列。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。