一 对一个外部文件的排序问题的巧妙解决
1 问题的描述
输入:
所输入的是一个文件,至多包含n个正整数,每个正整数都要小于n,如果一个正整数出现了一次以上,那么说明出错。
输出:
以增序的方式输出的整数数列。
约束 :
至多只有1M的内存空间,但是可用磁盘空间非常大,运行时间至多只允许几分钟。
二 解决方案
输入文件 -------------精彩排序------------------输出文件
将数据一次性的全部倒入内存,我们才能获得最快的速度。
实现细节:
用一个1000 万位的位图序列,来存储这些整数,在位序列中 第i为若为1 ,表示整数集中含有整数 i 。
若为0则表示整数集中不包含 i 。定义该位图序列之后,我们将编码分为下面几个部分。
(1) 首先清空该位图序列
for(int i = 0 ; i < n ;i++)
bitmap[i] = 0 ;
(2) 从input 文件中读取每一个整数,将对应的在位图序列中的位置为1
while(i = read(file))
{
bitmap[i] = 1 ;
}
(3) 输出位图序列阶段
for(int i = 0 ; i < n ; i++)
{
if(bitmap[i])
printf("&d" , i) ;
}
输出序列即为最后的排序结果,很巧妙。 综上问题解决。
三 感悟
1 问题精确地藐视 。
2 位图数结构(在系统编程中常用,以后在编码中应该熟练使用) ,java和c++中都有 BitSet类。
3 简单的设计,完美地解决了上面的问题。