原文:http://blog.sina.com.cn/s/blog_62186b4601019uz1.html

我们一般提到排序都是指内排序,比如快排,堆排序,归并排序等,所谓内排序就是能把所有待排序的数据外进内存之中,比如,一个数组之中。但是如果文件太大,文件中的所有数据不能一次性的放入内存之中,快排,堆排序,归并排序等内排序就无法工作了。

比如下面的程序生成了一个包含266万个int整型的文件,为了排序这266万个int整型,我们用外排序。

该算法分两个阶段:

阶段一:把原始数据分成M段,每次读取一段,存入一个数组,使用内排序算法对这一段数据进行排序,然后将排完序的数据写入一个临时文件。假定最大数组规模为10万个int型值,则每个临时文件中保存着10万个有序的int型值。我们用S1、S2、.....Sk表示这些临时文件,其中最后的一个数据段Sk,包含的数据个数可能不足10万。

阶段二:将每对有序数据段(比如S1跟S2、S3跟S4....)合并为一个大的有序的数据段,将其存入一个新的临时文件。重复此过程,直至只剩下一个数据段。

实现阶段一:

在函数initializeSegments中,我们将largedata.dat中每个规模为MAX_ARRAY_SIZE(10万)的数据段依次放入数组并排序,使用快排,并将所有排完序的数据依次存入一个名为f1.dat的新文件中。函数返回数据段的数目。

阶段一代码如下:

实现阶段二:

每个合并步骤中,两个有序数据段合并为一个新的更大的有序数据段,规模加倍,因此,数据段的数目减半。合并后数据无法放入内存中。合并步骤的实现方法是:首先将文件f1.dat中的前一半数据段移动到临时文件f2.dat中。然后将文件f1.dat的第一个数据段与文件f2.dat的第一个数据段合并,写入临时文件f3.dat中。(注 f1.dat中的数据段可能比f2.dat中的多一段,如果这样的话,在合并操作后,将其最后一段数据段直接复制到f3.dat中)

下面是合并所有数据段的代码:

完整的实现代码详见: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。

外排序分析:

在外排中,主要的代价是文件IO。假定原文件中待排序的数据个数为n。

在阶段一种,从原文件读取了n个元素,并写入临时文件,因此阶段一的IO开销为O(n)。

在阶段二中,在第一个合并操作之前,有序数据段的数目为n/c,其中c=MAX_ARRAY_SIZE。每个合并操作之后,有序数据段的数目减少一半。因此log(n/c)个步骤之后,数据段的数目为1。每个合并步骤中,从文件f1读取一半数据段,写入临时文件f2.f1剩余数据段与f2数据段进行合并。每个合并步骤的IO操作次数为O(n)。所以log(n/c)个合并操作总的IO次数为O(n)*log(n/c)。

所以外排序的复杂度为O(nlogn)。

大数据排序方案---外排序介绍相关推荐

  1. 证券期货行业监管大数据治理方案研究

    证券期货行业监管大数据治理方案研究 蒋东兴1, 高若楠2, 王浩宇2 1. 中国证券监督管理委员会信息中心,北京 100033: 2. 中证信息技术服务有限责任公司,北京 100033 摘要:为充分发 ...

  2. 新一代企业级大数据应用方案

    摘要:本文的整理自2017云栖大会-成都峰会上阿里云资深专家张辉的分享讲义,讲义主要由大数据时代大数据方案的三个思考引出大数据时代企业数据应用架构:由数据模型层到计算模型层到接口层.随后介绍了OLT- ...

  3. 【大数据相关】电商大数据之用户画像介绍

    因为平时工作中接触的跟大数据有关,于是学习了一下大数据 第一篇学习的是:慕课网 -- 大数据 --  电商大数据之用户画像介绍 笔记--基本概念介绍: 1.用户画像的价值 --- 有利于精准营销,营销 ...

  4. 第三课 大数据技术之Spark-RDD介绍和转换算子

    第三课 大数据技术之Spark-RDD介绍和转换算子 文章目录 第三课 大数据技术之Spark-RDD介绍和转换算子 第一节 RDD相关介绍 1.1 什么是 RDD 1.2 核心属性 1.3 执行原理 ...

  5. 作者:石在辉(1983-),男,中移(苏州)软件技术有限公司大数据产品部方案架构师。...

    石在辉(1983-),男,中移(苏州)软件技术有限公司大数据产品部方案架构师,主要从事解决方案.战略规划.产品规划等工作.

  6. (1)大数据和应用场景介绍

    专栏目录 (1)大数据和应用场景介绍 (2)大数据技术综述总结 (3)HDFS原理与高可用技术原理介绍 (4)Yarn架构.资源管理原理和运维技术介绍 (5)Kafka原理和高可用介绍 1.大数据基本 ...

  7. 基于区块链的大数据确权方案

    基于区块链的大数据确权方案 王海龙_gjq5464的博客-CSDN博客 区块链技术如何实现大规模数据确权?个人数据资产化:数据确权是核心_陀螺财经

  8. 大数据和Hadoop平台介绍

    大数据和Hadoop平台介绍 定义 大数据是指其大小和复杂性无法通过现有常用的工具软件,以合理的成本,在可接受的时限内对其进行捕获.管理和处理的数据集.这些困难包括数据的收入.存储.搜索.共享.分析和 ...

  9. 数据结构与算法 第八天常见排序+冒泡排序+快速排序+文件IO+大数据排序+文件合并

    数据结构与算法 第八天常见排序+冒泡排序+快速排序+文件IO+大数据排序+文件合并 第一章 冒泡排序 [1]Bubble_Sort.c 第二章 快速排序 [1]quick_sort.c 第三章 大数据 ...

最新文章

  1. ios framework 查看symbol_iOS开发高级分享 - App间账号共享与SDK封装
  2. 任意角度人脸检测pcn
  3. android学习---LinearLayout
  4. Python接口测试-模块引用与映射
  5. 对外汉语语料库有哪些_国内语料库建设一览表
  6. python 日历查询系统_python 日历
  7. 大白话带你梳理一下Dubbo的那些事儿
  8. 计算机学校综合管理系统论文,学校综合管理系统的设计与实现毕业设计论文.doc...
  9. 数据库设计的范式规范
  10. 16 计划稳定性与控制
  11. 设置Listview行高--小技巧
  12. Squid 配置文件详解
  13. paypal android 教程,android端集成paypal
  14. 防火门可以根据EN 1634-1 标准测试吗?
  15. 动手搭建自己的本地测试服务器
  16. MSSqlserver的锁模式介绍
  17. 11个趣味段子,个个蕴含深刻哲理!
  18. python语法基础知识第四关第二题_Python基础语法习题二
  19. slice与splice用法
  20. 免费云服务器使用体验

热门文章

  1. 一份来自太空的新年礼物——“元旦京港澳天宫对话”活动侧记
  2. ASP.NET machineKey的作用和使用方法
  3. Python:CSV到MySQL数据库
  4. 四、项目生命周期和开发生命周期
  5. IT人的日韩俄语歌单:已然被二次元的“恋爱循环”洗脑
  6. 作为一个在大厂工作多年的“螺丝钉”。生锈了,等待随时被换掉。
  7. 通过ssh代理连接内网MySQL
  8. yolov8 瑞芯微 RKNN 的 C++部署
  9. WPF 密码框按下和抬起事件
  10. python玫瑰花数量的含义_玫瑰数量的含义