问题:一个最多包含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万/8=1.19MB&g