bit-map再显身手:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数。限制: 可用内存为600MB.

        先看看这个题目:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数. 限制: 可用内存为600MB.  

 

       又是大数据。 看到42亿, 有灵感没? 要知道, 2的32次方就是42亿多一点点啊。42亿个无符号整数存在于文件中, 我们可以考虑在内存中用bit-map与之建立二值状态映射。 2的32次方个无符号整数, 需要内存空间为512M, 这个是很容易计算的。

 

       这么大的空间, 要用栈数组肯定不行, 可考虑用堆。 还是我们之前介绍过的bit-map,  用不着多说(别说我不描述思路啊, 代码就体现了思路), 直接给出代码:

 

#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位为0
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;
}

void setStateFromFile()
{
	ifstream cin("test.txt");  // 我测试的时候, 文件中的数据为:7 8 9 2 5 2 6 0 1 4 
    unsigned int n;
    while(cin >> n)  
    {  
        setOne(n);
    }  
}

void printResult()
{
	unsigned int i = 0;
	for(i = 0; i < N; i++)
	{
		if(0 == getState(i))
		{
			cout << i << endl; // 3
			break;
		}
	}	
}

int main() 
{
	createArr();
	setAllZero();
	setStateFromFile();
	printResult();
	deleteArr();

	return 0;
}

 

       结果与预期相符。  我们在测试的时候, 用的数据较小, 有兴趣的朋友可以把数据量加大, 进行测试。

 

 

       OK, 无非又是利用bit-map来节省空间而已, 其实很简单。 本文先介绍到这里了。

 

 

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值