是书上的一道问题,文件中保护至多10000000个记录,
每条记录都是一个7位整数.
你只有1mb的主存(我的编码完成所需内存会略大于1mb,
可以用多通道解决,这里暂不实现)
每个整数至多只能出现10次.
只是把位图法的存储空间变为4bit
即用4bit来表示该数的出现次数 为0则文件中无此数
以下是我自己用c实现的 编译器是vc6.0
#define BITSPERWORD 32
#define SHIFT 3
#define MASK 0x07
#define N 10000000
int a[4*N/BITSPERWORD];
/****************************************************
对于这里的set函数
最初我最直观的想法是把所需位的数取出来赋给一个变量
变量自加后,再赋给所存的位置
但由于涉及到位操作所以原储存的空间还需清零.
m = a[i>>SHIFT]>>(i&MASK)*4 & 0x0f;
m++;
clr(i);
a[i>>SHIFT] |= m<<(i&MASK)*4;
所以以后遇到问题还是要静下来想想.
或者暂时放下.
****************************************************/
void set (int i) { a[i>>SHIFT] += 1<<(i&MASK)*4 ; }
void clr (int i) { a[i>>SHIFT] &= ~(0x0f<<(i&MASK)*4) ; }
int test (int i) { return a[i>>SHIFT]>>(i&MASK)*4 & 0x0f ; }
int main(void)
{
int i , a;
for(i = 0; i < N; i++)
clr(i);
while(scanf("%d",&i) != EOF)
set(i);
for(i = 0; i < N; i++)
if(a = test(i))
while(a--)
printf("%d\n",i);
return 0;
}