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

来源:互联网 发布:上海女人护肤品 知乎 编辑:程序博客网 时间:2024/05/21 08:39

题目:

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



0 0
原创粉丝点击