来源于编程珠玑里的一道问题:给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。如果内存不足,仅可以用文件来进行处理,如何处理?
网上实现的范本不知来源 内容很精巧 搞懂了之后立马自己实现了一个来加深印象
--- C语言实现
源代码:
#include <stdio.h>
#include <windows.h>
int split (int *resourcearr,int*arrforbitone,int*arrforbitzero,int length,int bit)
{
int oneer,zeroer;
int i;
int bitresult,finalresult = -1;
int *temp;
while(bit--)
{
bitresult = (1<<bit);//从高位开始按位匹配
for( oneer = zeroer = i = 0;i<length;i++)//匹配过程
{
if(resourcearr[i]& (1<<bit))
{
arrforbitone[oneer++] = resourcearr[i];
}
else
{
arrforbitzero[zeroer++] = resourcearr[i];
}
}
if(oneer <= zeroer)//若此位为1较0多
{
finalresult+=bitresult;//因为bitresult已经处理过了 直接+就可以了
temp = arrforbitone;//将位少的数组重新赋予原数组
arrforbitone = resourcearr;
resourcearr = temp;
length = oneer;//更改原数组长度
}
else//若此位为0较1多
{
temp = arrforbitzero;
arrforbitzero = resourcearr;
resourcearr = temp;
length = zeroer;
}
}
return finalresult;//返回最终结果
}
int main()
{
int a[50] = {1,3,12,34123,54,4,3,47,2,123,254,-2,-1073741826,-536870914};
int b[50] = {0};
int c[50]={0};
printf("%d\n",split(a,b,c,50,32));
//-2,-1073741826,-536870914
system("pause");
return 0;
}
解释:初始的a数组为{1,3,12,34123,54,4,3,47,2,123,254};
第一次的输出结果为-2 于是在a数组中加上-2
第二次的输出结果为-1073741826 于是在a数组中加上-1073741826
第三次的输出结果为-536870914 实验结束