开篇
在之前的文章中,我们实现了用来排序的位图排序法,在对近1000万的整数进行排序时,理论上只需要1.25MB左右,但如果内存严格限制在1MB以内呢?还有另一个问题,之前的排序法中,都是考虑整数绝对不重复的情况,那么,如果整数如果有重复呢?
以上两个情况分别来自《编程珠玑》第一章课后习题5,以及习题6。
后面针对以上两种情况,分别实现不同的代码。
问题1
问题概要
输入: 一个最多包含n个正整数的文件,每个数都小于n,其中n=1000 0000。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。
输出:按升序排列的输入整数的列表。
约束: 严格现在在1MB及以内的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。
思路分析
如果使用位图来表示1000万个数需要1000万个位,或者说需要125万字节(1.19MB)。考虑到没有以数字0或者1打头的电话号码,所以可以将内存需求降低为100万字节(即800个位,0.95MB),这种情况下,之前实现的位图算法是没有问题的。
另一个做法是采用两趟算法,首先使用500 0000 / 8 = 625 000 个字节(0.6MB)的存储空间来排序0 ~ 499 9999 之间的整数,然后在第二趟排序500 0000 ~ 999 9999 的整数。k趟算法可以在kn的时间开销和n/k的空间开销内完成对最多n个小于n的无重复正整数的排序。
此处,我们使用两趟算法,需要对之前实现的位图排序进行修改。为一劳永逸,直接将排序的趟数改为可指定的,即:可指定n趟的位图排序法(
可指定n趟的位图排序法拓展

最低0.47元/天 解锁文章
8974

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



