如何给磁盘文件排序?--学习《编程珠玑》

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何给磁盘文件排序?--学习《编程珠玑》相关的知识,希望对你有一定的参考价值。

输入:一个最多包含n个正整数的文件,每个都小于n,其中n=10^7。如果在输入文件中有任何证书重复出现就是致命错误。没有任何其他数据与该整数相关联。

输出:按升序排列的输入整数的列表。

约束:最多有(大约)1MB的内存空间可用,有充足的磁盘空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。

 

程序设计:

1)基于磁盘的归并排序:多次读写,多次归并排序。每读入输入文件一次,进行归并排序,再写入输出文件一次。

工作文件多次读写。

 

2) 多趟快速排序:1M内存可以保存250, 000个整数,遍历输入文件40次:第一次将0~249, 999之间的整数读入内存,进行快速排序(内存中快速排序最快),写入输出文件;第二次将250,000~499, 999之间的整数读入内存,进行快速排序,写入输出文件;以此类推,到第40趟遍历时,将975, 000~999, 999之间的整数进行快速排序,写入输出文件,整个排序过程完成。

读入输入文件多次,写输出文件仅一次,不使用中间文件。优于1)。

 

3)神奇排序:读输入文件仅一次,且不使用中间文件。==> 能否用大约800万个可用位来表示最多1000万个互异的整数。

使用位图或维向量表示集合。使用一个具有1000万个位的字符串来表示这个文件,其中,当且仅当整数i在文件中存在时,第i位为1。(有200万个稀疏位?)

使用这种算法的限制:

  1. 输入数据限制在相对较小的范围内;
  2. 数据没有重复;
  3. 每条记录可用整数来表示

 

:) 对小问题的仔细分析有时可以得到明显的实际益处。

以上是关于如何给磁盘文件排序?--学习《编程珠玑》的主要内容,如果未能解决你的问题,请参考以下文章

第8周读书笔记-读《编程珠玑》有感

编程珠玑第一章习题

编程珠玑——第一章习题

[编程珠玑]位向量与排序

编程珠玑第一章书后习题解答

编程珠玑查找排序B+树