腾讯面试题——位图的应用

题目:

给40亿个不重复的无符号整型,没排过序。给一个无符号整数,如何快速判断这个数是否存在在这40亿个数中


set()函数图解

reset()函数图解


“BitMap.h”

<strong><span style="font-size:18px;">#pragma once
#include<vector>

class BitMap
{
public:
	//range 范围
	BitMap(size_t range)
	{
		//size_t有四个字节,每个字节有八个位
		//右移5相当于除以32
		_bitmap.resize((range>>5) + 1);
	}

	void Set(size_t x)//0->1
	{
		//先求出在第几个数上
		size_t index = x/32;//相当于x>>5

		//在求出在第几个位上
		size_t num = x%32;

		_bitmap[index] |= (1<<num);
	}

	void Reset(size_t x)//1->0
	{
		size_t index = x/32;
		size_t num = x%32;

		_bitmap[index] &= (~(1<< num));
	}

	bool Test(size_t x)//x存在与否
	{
		size_t index = x/32;
		size_t num = x%32;

		return _bitmap[index] & (1<<num);
	}
private:
	vector<size_t> _bitmap;	
};</span></strong>
“test.cpp”

<strong><span style="font-size:18px;">#include<iostream>
using namespace std;
#include"bitset.h"

void test()
{
	BitMap bm(400);
	bm.Set(2);
	bm.Set(22);
	bm.Set(222);
	
	cout<<"set(2) set(22) set(222)"<<endl;
	cout<<"set(2) ? "<<bm.Test(2)<<endl;
	cout<<"set(22) ? "<<bm.Test(22)<<endl;
	cout<<"set(222) ? "<<bm.Test(222)<<endl;
	cout<<"set(3) ? "<<bm.Test(3)<<endl;

	bm.Reset(22);
	cout<<endl<<"reset(22)"<<endl;
	cout<<"set(2) ? "<<bm.Test(2)<<endl;
	cout<<"set(22) ? "<<bm.Test(22)<<endl;
	cout<<"set(222) ? "<<bm.Test(222)<<endl;
	cout<<"set(3) ? "<<bm.Test(3)<<endl;
}
int main()
{
	test();
	return 0;
}</span></strong>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值