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

题目:

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


set()函数图解

腾讯面试题——位图的应用_第1张图片

reset()函数图解

腾讯面试题——位图的应用_第2张图片

“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>



你可能感兴趣的:(腾讯面试题——位图的应用)