位图排序法拓展: 可指定n趟的位图排序法

可指定n趟的位图排序法拓展

开篇

在之前的文章中,我们实现了用来排序的位图排序法,在对近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趟的位图排序法(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值