数据结构之BITMAP
来源:互联网 发布:计算机应用与软件投稿 编辑:程序博客网 时间:2024/05/29 20:01
我们先给出之前我看过的腾讯公司的一道笔试题,引出位图BitMap。
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。
这个问题怎么解决呢?
1)将40亿数据保存起来(保存在数组、链表、树中),再和该数判断是否相等。
那我们思考一下需要多少内存:
2)借助位图BitMap解决。
位图(BitMap)
是用一个数组中的每个数据的每个二进制位表示一个数是否存在。1表示存在,0表示不存在。
相当于把数组分成很多块的空间,每一块是32个比特位。
原来32个比特位放一个数据,现在一个位就可以放一个数据。16GB/32=0.5GB=512MB。
位图的实现:
#ifndef __BITMAP_H__#define __BITMAP_H__#include<iostream>using namespace std;#include<vector>class BitMap{public: BitMap(size_t size = 0) :_size(0) { //_a开辟多一个空间,如size=36/32=1,需要两块空间才能放下 _a.resize((size >> 5) + 1); } void Set(size_t x) { //size_t index = x / 32; size_t index = (x >> 5); size_t num = x % 32; //if(!(_a[index] & (1 << num))表示该二进制位不存在,则该位二进制置成1 if (!(_a[index] & (1 << num))) { _a[index] |= (1 << num); ++_size; } } void Reset(size_t x) { //size_t index = x / 32; size_t index = x >> 5; size_t num = x % 32; //该位存在则将该位二进制置为0 if (_a[index] & (1 << num)) { _a[index] &= ~(1 << num); --_size; } } bool Test(size_t x) { //size_t index = x / 32; size_t index = x >> 5;//获取索引值 size_t num = x % 32;//获取索引值内的位置 if (_a[index] & (1 << num))//某一位是否存在 0代表不存在 1代表存在 { return true; } return false; } void Resize(size_t size) { _a.resize(size); }private: vector<size_t> _a; size_t _size;};#endif //__BITMAP_H__
阅读全文
0 0
- 数据结构之BITMAP
- c/c++ 数据结构之位图(bitmap)详解
- 数据结构之位图(bitmap)详解 (转)
- 趣味数据结构 – BitMap
- 【数据结构】BitMap使用
- java Bitmap 数据结构
- 数据结构——bitmap
- Python: 实现bitmap数据结构
- 【数据结构】位图BitMap
- 数据结构——bitmap
- C++实现BitMap数据结构
- MD中的bitmap(2) - bitmap数据结构
- Bitmap处理之Bitmap缓存
- Bitmap 处理 之加载大的Bitmap
- Bitmap详解之获取Bitmap的方法
- 高效显示Bitmap之缓存Bitmap
- android之BitMap
- intent传参 之 Bitmap
- MySQL命名规范
- CRM的dev(二)--货币金额的大小限制以及货币格式化
- android中常见单位 dp,sp,px,pt,in,mm,dpi,dip详解
- mac 大型垃圾手动清理 无需安装软件
- Python selenium —— 用chrome的Mobile emulation模拟手机浏览器测试手机网页
- 数据结构之BITMAP
- Oracle分页思想
- 线程问题
- 图像处理/255.0 和/127.5 -1
- json学习
- Android开发常用的第三方框架
- Mac安装eclispe提示java7不符合要求需要java8的解决办法
- 《BLINKS: Ranked Keyword Searches on Graphs》——论文笔记
- HTML xmlns 属性