举个简单例子,在C++中一个int类型的数有32位,而这32只表示一个数太过浪费,于是就考虑让这32位可以表示32个数,每一位表示该数是否存在
如给定表示文件中整数集合的位图数据结构,则可以分三个阶段来编写程序
第一阶段:将所有的位都置为0,从而将集合初始化为空。
第二阶段:通过读入文件中的每个整数来建立集合,将每个对应的位置都置为1。
第三阶段:检验每一位,如果该为为1,就输出对应的整数,有此产生有序的输出文件。
给40亿个不重复的unsigned int的整数,没有排过序,然后再给一个数,如果快速判断这个数是否在那40亿个数当中。(腾讯面试题)
用位图法:40亿unsigned int,则用位图表示的话需要大小为40亿个bit=4*bit=0.5*
bytes 因此申请的内存只需要大小约为512MB左右,这样在内存每个bit代表一个unsigned int整数,并将每个bit初始化为0,然后将40亿个unsigned int的整数读入,每个unsigned int的整数对应bit设置为1,读入后,最后看所给定的数对应的bit是否为1,是1存在,否则不存在。
c++实现
#include <iostream>
#include<bitset>
using namespace std;
int main(int argc, char *argv[])
{
const int max = 10000000;
int n,i;
bitset<max+1> bit; //初始默认所有二进制位为0
while(scanf("%d",&n)!=EOF)
{
bit.set(n,1); //将第n位置1
}
for(i=0;i<=max+1;i++)
{
if(bit[i]==1)
printf("%d ",i);
}
return 0;
}