#include <iostream>
#include <fstream>
using namespace std;
/*
使用位向量法解决,分成两次扫描文件,按照内存大小把数据分成若干块,
第一次扫描找到哪一块包含缺少的数据,第二次扫描找到那一块的位置
*/
void findNumber()
{
int bitSize = 1024 * 1024; //每块存放2的20次方bit数据
int blockNum = 4096; //块数为2的12次方
int len = bitSize / 32; //每块存放的整数个数
int* array = new int[len];
int* blocks = new int[blockNum];
int starting = -1; //缺少的那个数所在块的起始位置
ifstream in("file.txt");
if (!in)
{
cout << "file open error!" << endl;
return;
}
while (!in.eof())
{
int temp;
in >> temp;
blocks[temp / bitSize]++; //计算属于哪一块,该块的元素个数+1
}
for (int i = 0; i < blockNum; i++)
{
if (blocks[i] < len) //找到缺少数据的那一块
{
starting = i * len;
break;
}
}
ifstream in2("file.txt");
if (!in2)
{
cout << "file open error!" << endl;
return;
}
while (!in2.eof())
{
int n;
in2 >> n;
if (n >= starting && n < starting + len) //再次扫描一遍文件,如果数据落在该块内,就把相应位置置1
{
array[(n-starting)/32] |= 1 << ((n-starting)%32);
}
}
for (int i = 0; i < len; i++)
{
for (int j = 0; j < 32; j++)
{
if (array[i] & (1 << j) == 0) //扫描数组获得某一位为0,计算出不在文件中的数字
{
cout << i * 32 + j + starting; //该块起始数据+该块位置得到缺少数据
return;
}
}
}
}
int main()
{
findNumber();
return 0;
}
一个文件含有40亿个非负整数,使用10MB内存,找到一个不在该文件中的整数
最新推荐文章于 2021-04-01 20:50:39 发布