2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。
int getval(const unsigned char& c,int num){
int i=0,j=0;
if(((0x1<<(2*num))&c)==(0x1<<(2*num)))
i=1;
if(((0x1<<(2*num+1))&c)==(0x1<<(2*num+1)))
j=1;
return 2*j+i;
}
void setval(unsigned char& c,int num,int val){
if(val==1){
c= c|(0x1<<(2*num));
}else if(val==2){
c= c&(~((0x1<<(2*num))));
c= c|(0x1<<(2*num+1));
}
}
void setbit(unsigned char* a,int num){
unsigned char* p=a;
for(int i=0;i<num/4;++i){
p++;
}
if(getval(*p,num)==0){
setval(*p,num%4,1);
}else if(getval(*p,num)==1){
setval(*p,num%4,2);
}
}
int main(int argc, char** argv) {
unsigned char a[1024*1024*1024];
memset(a,0,sizeof(a));
FILE* file=fopen("in.txt","r");
unsigned uu=250000000;
char rn='\n';
for(unsigned int i=0;i<uu;++i){
int r;
fscanf(file,"%d",&r);
setbit(a,r);
// fwrite(&rn,1,1,file);
}
unsigned count=0;
unsigned char* p=a;
for(size_t i=0;i<1024*1024*1024;++i){
for(int j=0;j<4;++j){
if(getval(*p,j)==1)
count++;
}
p++;
}
cout<<count<<endl;
fclose(file);
return 0;
}