举例
比如,要对900 MB的数据进行排序,但机器上只有100 MB的可用内存时,外归并排序按如下方法操作:
1、读入100 MB的数据至内存中,用某种常规方式(如快速排序、堆排序、归并排序等方法)在内存中完成排序。
2、将排序完成的数据写入磁盘。
3、重复步骤1和2直到所有的数据都存入了不同的100 MB的块(临时文件)中。在这个例子中,有900 MB数据,单个临时文件大小为100 MB,所以会产生9个临时文件。
4、读入每个临时文件(顺串)的前10 MB的数据放入内存中的输入缓冲区,最后的10 MB作为输出缓冲区。
5、执行九路归并算法,将结果输出到输出缓冲区。一旦输出缓冲区满,将缓冲区中的数据写出至目标文件,清空缓冲区。
6、一旦9个输入缓冲区中的一个变空,就从这个缓冲区关联的文件,读入下一个10M数据,除非这个文件已读完。
总结
1、大文件过大,不能一次加载,所以需要拆分成k个小文件
2、k个小文件各自排序,为下一步文件归并打好铺垫
3、二路归并元素比较次数过多,效率低
4、k路归并中,堆排序可以很快更新,但操作数不够精简;胜者树父节点记录胜利的一方,更新时需要比较父节点和兄弟节点;败者树是胜者树的一种变体,父节点记录失败的一方,同时胜利一方与上一级的父节点比较,更新只需要比较父节点。因此在实际应用中采用败者树更好。
1896

被折叠的 条评论
为什么被折叠?



