问题:一个最多包含n个没有重复正整数的文件,每个数都小于n,其中n为10的7次方。最多有1MB的内存空间可用,用充足的磁盘空间可用。
方案一:基于磁盘的归并排序
方案二:
如果每个号码都用7个字节来存储,那么在可用的1MB的存储空间里大约可以存143000个号码。如果每个号码都用32位整数来表示的话,在1MB的存储空间里就可以储 250000个号码。因此,可以使用遍历输入文件10000000/250000=40趟的程序完成排序。在第一趟遍历中,将0至249999之间的任何整数都读入内存,并对这(最多)250000个 整数进行排序,让后写到输出文件中。第二趟遍历排序250000至499999之间的的整数,依次类推,到第40趟遍历的时候对9750000至9999999之间的整数进行排序。对内存中的 排序来说,快速排序会相当有效。
缺点:读取输入文件40次
方案三:使用位图
位图数据结构:该数据结构描述了一个有限定义域内的稠密集合,其中的每一个元素最多出现一次并且没有其他任何数据与该元素相关联。即使这些条件没有完全满足(例如,存在重复元素或额外的数据),也可以用有限定义域内的键作为一个表项更复杂的表格的索引。
可用一个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
可以使用1000万个位(1000

本文探讨了如何在只有1MB内存限制但拥有充足磁盘空间的情况下,对包含最多1亿个正整数的大文件进行排序。提出了基于磁盘的归并排序、分块快速排序和位图排序三种方案。位图排序利用20位字符串表示有限整数集合,通过检查位来确定数字是否存在,解决了内存限制问题。同时,文章也提出对于超出范围或非数值的输入处理问题。
最低0.47元/天 解锁文章
3998

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



