大数据排序方案---外排序介绍
来源:互联网 发布:叶利钦炮打白宫知乎 编辑:程序博客网 时间:2024/05/18 21:08
原文:http://blog.sina.com.cn/s/blog_62186b4601019uz1.html
我们一般提到排序都是指内排序,比如快排,堆排序,归并排序等,所谓内排序就是能把所有待排序的数据外进内存之中,比如,一个数组之中。但是如果文件太大,文件中的所有数据不能一次性的放入内存之中,快排,堆排序,归并排序等内排序就无法工作了。
该算法分两个阶段:
阶段一:把原始数据分成M段,每次读取一段,存入一个数组,使用内排序算法对这一段数据进行排序,然后将排完序的数据写入一个临时文件。假定最大数组规模为10万个int型值,则每个临时文件中保存着10万个有序的int型值。我们用S1、S2、.....Sk表示这些临时文件,其中最后的一个数据段Sk,包含的数据个数可能不足10万。
阶段二:将每对有序数据段(比如S1跟S2、S3跟S4....)合并为一个大的有序的数据段,将其存入一个新的临时文件。重复此过程,直至只剩下一个数据段。
实现阶段一:
阶段一代码如下:
实现阶段二:
下面是合并所有数据段的代码:
完整的实现代码详见:http://www.oschina.net/code/snippet_176897_13955
(1)int numberOfSegments =initializeSegments(MAX_ARRAY_SIZE, "largedata.dat", "f1.dat");
从原文件中创建初始数据段,并将有序数据段存入文件f1.dat中。
(2)merge(numberOfSegments, MAX_ARRAY_SIZE, "f1.dat", "f2.dat", "f3.dat");
将f1中的文件合并到f3中,利用f2做辅助。函数merge递归的调用多次,完成多个合并操作。每个步骤将numberOfSegments减少一半,而将每个数据段的大小增至一倍。完成一个合并操作后,下一个合并步骤中将f3中的新数据段合并至f2中,用f1做辅助。因此新调用的合并函数应该为:
merge((numberOfSegments + 1) / 2, segmentSize * 2, f3, f1, f2);
递归函数merge当numberOfSegments变为1时终止,在此情况下,f1包含排好序的数据。将f1复制到sortedlargedata.dat。
外排序分析:
- 大数据排序方案---外排序介绍
- 外排序(大数据文件排序)
- 外排序的介绍、实现、数据测试
- 多路归并 外排序 大文件排序 海量数据处理
- 归并法外排序—海量数据排序
- 外排序和归并排序
- 内排序和外排序
- 内排序与外排序
- 归并排序实现外排序
- 内排序和外排序
- 多路归并排序 外排序 大文件排序 java实现
- 使用groovy进行大文件外排序
- 内排序与外排序的关系
- 合并排序:数组和单链表,外排序
- 内排序和外排序的理解
- 二叉查找树(通过外排思想处理大数据)
- 外排序
- 外排序
- Applet的编辑,编译与运行
- 输出菱形图案(难度系数:1颗星)
- 使用matplotlib绘制图像并设置标题以及坐标轴等信息
- shu_mj 的数据结构专场(二)
- 《三张表格走天下》读后感
- 大数据排序方案---外排序介绍
- ZOJ1199-Point of Intersection
- E. Interesting Graph and Apples
- Tomcat下web项目部署方式
- cannon算法的原理及MPI C语言实现
- 《三张表格走天下》读书笔记
- IntelliJ IDEA 2017 注册码
- 电子书的Makefile(待分析)
- JDK里其他几个工具