bitmap再出江湖:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G

        之前聊过很多与bitmap有关的东东, 今天我们来看这样一个问题:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G.

 

        很简单, 还是用bitmap, 思路我就不说了, 因为思路完全在下面的代码中:

 

#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位为0
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, 不多说, 一切思路尽在代码之中。

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值