bitmap再出江湖:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G
2015-09-02 15:30
120 查看
之前聊过很多与bitmap有关的东东, 今天我们来看这样一个问题:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G.
很简单, 还是用bitmap, 思路我就不说了, 因为思路完全在下面的代码中:
[cpp] view
plaincopy
#include <iostream>
#include <fstream>
using namespace std;
#define BIT_INT 32 // 1个unsigned int可以标志32个坑
#define SHIFT 5
#define MASK 0x1f
#define N 4294967296 // 2的32次方
unsigned int *a = NULL;
// 必须用堆
void createArr()
{
a = new unsigned int[1 + N / BIT_INT];
}
void deleteArr()
{
delete []a;
a = NULL;
}
// 将所有位都初始化为0状态
void setAllZero()
{
memset(a, 0, (1 + N / BIT_INT) * sizeof(unsigned int));
}
// 设置第i位为1
void setOne(unsigned int i)
{
a[i >> SHIFT] |= (1 << (i & MASK));
}
// 设置第i位为1
void setZero(unsigned int i)
{
a[i >> SHIFT] &= ~(1 << (i & MASK));
}
// 检查第i位的值
int getState(unsigned int i)
{
return (a[i >> SHIFT] & (1 << (i & MASK))) && 1;
}
// 用bitmap记录是否存在
void setStateFromFile()
{
ifstream cin("a.txt");
unsigned int n;
while(cin >> n)
{
setOne(n);
}
}
// 哈哈
void printCommonNumber()
{
ifstream cin("b.txt");
unsigned int n;
while(cin >> n)
{
if(1 == getState(n))
{
cout << n << " ";
}
}
cout << endl;
}
int main()
{
createArr();
setAllZero();
// a.txt: 4 5 7 2 9 2 4 8 0 11 (其实a.txt中可以有40亿个无符号整数)
// b.txt: 6 11 0 2 3 (其实b.txt中可以有10000个无符号整数)
setStateFromFile();
printCommonNumber(); // 11 0 2
deleteArr();
return 0;
}
OK, 不多说, 一切思路尽在代码之中。
很简单, 还是用bitmap, 思路我就不说了, 因为思路完全在下面的代码中:
[cpp] view
plaincopy
#include <iostream>
#include <fstream>
using namespace std;
#define BIT_INT 32 // 1个unsigned int可以标志32个坑
#define SHIFT 5
#define MASK 0x1f
#define N 4294967296 // 2的32次方
unsigned int *a = NULL;
// 必须用堆
void createArr()
{
a = new unsigned int[1 + N / BIT_INT];
}
void deleteArr()
{
delete []a;
a = NULL;
}
// 将所有位都初始化为0状态
void setAllZero()
{
memset(a, 0, (1 + N / BIT_INT) * sizeof(unsigned int));
}
// 设置第i位为1
void setOne(unsigned int i)
{
a[i >> SHIFT] |= (1 << (i & MASK));
}
// 设置第i位为1
void setZero(unsigned int i)
{
a[i >> SHIFT] &= ~(1 << (i & MASK));
}
// 检查第i位的值
int getState(unsigned int i)
{
return (a[i >> SHIFT] & (1 << (i & MASK))) && 1;
}
// 用bitmap记录是否存在
void setStateFromFile()
{
ifstream cin("a.txt");
unsigned int n;
while(cin >> n)
{
setOne(n);
}
}
// 哈哈
void printCommonNumber()
{
ifstream cin("b.txt");
unsigned int n;
while(cin >> n)
{
if(1 == getState(n))
{
cout << n << " ";
}
}
cout << endl;
}
int main()
{
createArr();
setAllZero();
// a.txt: 4 5 7 2 9 2 4 8 0 11 (其实a.txt中可以有40亿个无符号整数)
// b.txt: 6 11 0 2 3 (其实b.txt中可以有10000个无符号整数)
setStateFromFile();
printCommonNumber(); // 11 0 2
deleteArr();
return 0;
}
OK, 不多说, 一切思路尽在代码之中。
相关文章推荐
- Java学习之排序
- linux文本编辑器
- HDU 1710 树的遍历
- priority_queue用法
- 总结_六天专题:栈和队列,树,并查集,KMP匹配算法
- HDU 1010 搜索+剪枝
- next_permutation用法 与 字典序
- STL入门资料
- 总结_搜索专题(四天)及练习赛总结
- 总结_ACM 之歌
- hdu 1846 (简单博弈题)
- hdu 1422 DP
- hdu 1098 多项式整除问题
- ZOJ 1318 (第k个序列,简单数学题)
- 俗话说。。俗话又说。。
- hdu 3469 (tju 3552) Catching the Thief 博弈 数学题
- hdu 3471 (tju 3554) England vs Germany (计算几何)
- 混合图的欧拉回路
- hdu3472 (tju3555) HS BDC (混合图的欧拉回路)
- KMP算法详解