博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bitmap海量数据
阅读量:4113 次
发布时间:2019-05-25

本文共 1133 字,大约阅读时间需要 3 分钟。

1.腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

思想:用数组来存这40亿个数,而且只能用bit来表示。why?40亿约等于4G,就算你用一个字节来,也需要4GB,32位的机子爆掉了。如果用bit来存,意思一个字节就能表示8个数,这个样子只需要512M内存。这个属于接受范围。如果有内存要求,则可以分块。

如何用bit位表示某个数?下面以1为例。

  • 1/8=0,即存在数组的第0位。
  • 1%8=1,即存在数组第0位的char的第1位,将该位置为1。
在举个例子,12345。
#include
#include
#include
using namespace std; void setBit(char *arr,unsigned int num); int isSet(char *arr,unsigned int num); unsigned char tag[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; int main() { char * arr=new char[5242880];//512M memset(arr,0,5242880); unsigned int num; fstream in("1.txt",ios::in); while(in>>num) { setBit(arr,num); } in.close(); cout<<"初始化完毕..."<
>num) { if(isSet(arr,num)!=0x00) { cout<
<<"在数组中"<

  • 12345/8=1543,即数组的第1543位
  • 12345%8=1,即存在数组的第1543位的char的第1位,将该位置为1。
我们以16进制来表示char中每一位单独置为1的情况,即0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01。

如何判断将某一位置为1?

以将a[0]的第二位置为1为例,用位或。a[0]=a[0] | 0x20;

判断某一位是否置为1?

判断a[0]的第二位是否置为1,用位与,a[0] &0x20.如果置为1,返回非0,否则返回0.

转载地址:http://magsi.baihongyu.com/

你可能感兴趣的文章
设计模式六大原则(6):开闭原则
查看>>
阿里面试总结--JAVA
查看>>
Servlet的生命周期
查看>>
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
【设计模式】—-(2)工厂方法模式(创建型)
查看>>
有return的情况下try catch finally的执行顺序(最有说服力的总结)
查看>>
String s1 = new String("abc"); String s2 = ("abc");
查看>>
JAVA数据类型
查看>>
Xshell 4 入门
查看>>
SoapUI-入门
查看>>
Oracle -常用命令
查看>>
JAVA技术简称
查看>>
ORACLE模糊查询优化浅谈
查看>>
2016——个人年度总结
查看>>
2017——新的开始,加油!
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.1、类和实例
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>