怎样给一个磁盘文件排序?
来源:互联网 发布:上海中磁数据恢复中心 编辑:程序博客网 时间:2024/05/20 04:08
假设给你一个问题:怎样给一个磁盘排序?我们首要做的就是分析该问题,弄清问题的正确的具体描述(尤其在面试的时候很重要)。
问题的准确描述:1、输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10000000。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数关联;2、输出:按升序排列的输入整数的列表;3、约束:最多有大约1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒钟就不需要进一步优化了
一、一般的磁盘文件排序
1、内排序
由于要求的可用内存为1MB,那么每次可以在内存中对250K的数据进行排序,然后将有序的数写入硬盘。那么10M的数据需要循环40次,最终产生40个有序的文件。
2、多路归并排序
(1)将每个文件最开始的数读入(由于有序,所以为该文件最小数),存放在一个大小为40的first_data数组中;
(2)选择first_data数组中最小的数min_data,及其对应的文件索引index;
(3)将first_data数组中最小的数写入文件result,然后更新数组first_data(根据index读取该文件下一个数代替min_data);
(4)判断是否所有数据都读取完毕,否则返回(2)。
显然上述方法的时间可能需要几分钟,甚至几十分钟,下面提供一种高效的方法,节选自《编程珠玑》!!
二、利用位图数据结构给磁盘文件排序
程序设计:一般的分段读取磁盘文件,内存利用快速排序,外存利用归并排序(需要多趟读入磁盘文件)。能否找到一种方法只需一次读入,经过神奇的排序,一次输出。
实现概要:可以利用位图表示或位向量表示集合,比如可用一个20位长的字符来表示一个所有元素都小于20的简单非负整数集合。{1,2,3,5,8,13}:0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0.
采取折中方案的属性限制:输入数据限制在相对较小的范围内;数据没有重复;对于每条记录而言,除了单一整数外,没有任何其他关联数据。
伪代码表示:
/*phase 1: initialize set to empty*/
for i=[0,n)
bit[i]=0
/*phase 2: insert present elsements intothe set*/
for each i in the input file
bit[i]=1
/*phase 3: write sorted output*/
for i=[0,n)
if bit[i]==1
writei on the output file
由于内存只要1MB的内存空间,共有1024*1024*8位,对于10000000个元素,需要大约1.2MB的内存,这是可以将其分成两块:可分为2块(k=2,1趟反正占用的内存只有1.25/2=0.625M),1~4999999,和5000000~9999999先遍历一趟,处理1~4999999的数据块(用5000000/8=625000个字的存储空间来排序0~4999999之间的整数),然后再第二趟,对5000001~1000000这一数据块处理。
正确问题(明确题目的具体描述)、位图数据结构、多趟算法(可以利用多路排序)、时间空间折中与双赢(空间上高效的位图结构显著的减少了排序的运行时间)、简单设计(设计者确定其设计已经达到了完美的标准不是不能再增加任何东西,而是不能再减少任何东西)。
- 怎样给一个磁盘文件排序?
- 给磁盘文件排序
- 如何给磁盘文件排序
- 给磁盘文件排序(位图)
- 如何给10^7个数据量的磁盘文件排序
- 如何给10^7个数据量的磁盘文件排序
- 如何给10^7个数据量的磁盘文件排序
- 如何给10^7个数据量的磁盘文件排序
- 如何给10^7个数据量的磁盘文件排序
- 如何给10^7个数据量的磁盘文件排序
- 如何给大数据量的磁盘文件排序
- 如何给10^7个数据量的磁盘文件排序
- 【参考】给大数据量的磁盘文件排序
- 给10^7个数据量的磁盘文件排序
- 如何给10^7个数据量的磁盘文件排序
- 如何给10^7个数据量的磁盘文件排序
- 经典算法之外部排序(给10^7个数据量的磁盘文件排序)
- 程序员编程艺术:第十章、如何给10^7个数据量的磁盘文件排序
- GlusterFS简单安装与配置
- java多态困惑
- Linux chmod命令修改文件与文件夹权限方法
- 解析Java finally
- android WebView的使用和进度条
- 怎样给一个磁盘文件排序?
- Ehcache入门指南
- Python内建异常清单
- 图片标签img中alt与title的区别
- 初学调用epay实现在线支付原理
- HDU 1907- John(NImm博弈)
- Android使用Handler实时更新UI
- 数组(2)
- 处理列表元素的非常规写法。