Bitmap 位图

1.  概述

位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用。本文介绍了位图的实现方法及其应用场景。

2. 位图实现

(1)自己实现

在位图中,每个元素为“0”或“1”,表示其对应的元素不存在或者存在。

#define INT_BITS sizeof(int)

#define SHIFT 5 // 2^5=32

#define MASK 0x1f // 2^5=32

#define MAX 1024*1024*1024 //max number

int bitmap[MAX / INT_BITS];

/*

* 设置第i位

* i >> SHIFT 相当于 i / (2 ^ SHIFT),

* i&MASK相当于mod操作 m mod n 运算

*/

void set(int i) {

bitmap[i >> SHIFT] |= 1 << (i & MASK);

}

//获取第i位

int test(int i) {

return bitmap[i >> SHIFT] & (1 << (i & MASK));

}

//清除第i位

int clear(int i) {

return bitmap[i >> SHIFT] & ~(1 << (i & MASK));

}

(2)函数库实现

C++的STL中有bitmap类,它提供了很多方法,详见:http://www.cplusplus.com/reference/stl/bitset/

3.  位图应用

3.1    枚举

(1)全组合

字符串全组合枚举(对于长度为n的字符串,组合方式有2^n种),如:abcdef,可以构造一个从字符串到二进制的映射关系,通过枚举二进制来进行全排序。

null——> 000000

f——> 000001

e——> 000010

ef——> 000011

……

abcedf——> 111111

(2)哈米尔顿距离

枚举算法,复杂度是O(N^2),怎样降低复杂度呢?

如果是N 个二维的点,那么我们可以怎么用较快的方法求出

通过简单的数学变形,我们可以得到这样的数学公式:

通过观察,我们发现每一对相同元的符号必定相反,如:x_i-y_i,于是我们有了一个二进制思想的思路,那就是枚举这些二i维的点的x 轴y 轴前的正负号,这样就可以用一个0~3 的数的二进制形式来表示每个元素前面的正负号,1表示+号,0表示?号,如:2 表示的二进制位形式为10表示x_i-y_i。这样我们就可以通过2^2*N次记录下这些二元组的不同的符号的数值,对于每个二进制来表示的不同的式子只需记录下他们的值,这样我们只需求max_i 和min_i出这些相同的二进制表示的式子max_i –min_i,最后我们就可以解出ans=max{max_i-min_i}。

通过位图,算法时间复杂度可将为O(N)。

3.2   搜索

设计搜索剪枝时,需要保存已经搜索过的历史信息,有些情况下,可以使用位图减小历史信息数据所占空间。

3.3    压缩

(1)     在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数?

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

4. 总结

Bitmap是一种非常简洁快速的数据结构,他能同使证存储空间和速度最优化(而不必空间换时间)。

5.  参考资料

(1)     《C实现bitmap位图》:

http://blog.csdn.net/QIBAOYUAN/archive/2010/09/29/5914662.aspx

(2)     武森《浅谈信息学竞赛中的“0”和“1”》

——————————————————————————

时间: 2024-10-12 13:44:25

Bitmap 位图的相关文章

【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究

通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”.位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况. 1.为比较区别,创建两种索引类型的测试表1)在表t_bitmap上创建位图索引[email protected]> create table t_bitmap (id number(10), name varchar2(10),sex varchar2(1)); Table created. [email protected]>

ios 基本图形的绘制 基于bitmap 位图

内容包括 图片水印,图片裁剪,屏幕截图,背景平铺 1.图片水印功能 #import "UIImage+MJ.h" @implementation UIImage (MJ) + (instancetype)waterImageWithBg:(NSString *)bg logo:(NSString *)logo { UIImage *bgImage = [UIImage imageNamed:bg]; // 1.创建一个基于位图的上下文(开启一个基于位图的上下文) UIGraphicsB

重温delphi之:如何将Bitmap位图与base64字符串相互转换

先引用delphi自带的单元 uses EncdDecd; 然后就可以使用下面二个函数了: by 菩提树下的杨过 http://yjmyzz.cnblogs.com/ ///将Bitmap位图转化为base64字符串function BitmapToString(img:TBitmap):string ;var  ms:TMemoryStream;  ss:TStringStream;  s:string;begin    ms := TMemoryStream.Create;    img.S

BitMap位图

BitMap位图算法https://blog.csdn.net/varyall/article/details/79662029 常见面试题 题1:在2.5亿个整数找出不重复的整数,内存不足以容纳着2.5亿个整数. 方案1:使用2-Bitmap 每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义.然后遍历修改Bitmap中的对应位,如果是00则变01,01则变10,10则保持不变.遍历修改完后,最后遍历输出对应位是01的整数. 方案2:分治法 先将2.5亿个数划分成

BitMap位图与海量数据的理解

1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省. 2. Bit Map的基本思想 我们先来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复).那么我们就可以采用Bit-map的方法来达到排序的目的.要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将

bitmap位图法

位图法定义 位图法就是bitmap的缩写,所谓bitmap,是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个数据存不存在的. 例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示.那么就可以开一个int数组,一个int有32个位,就可以表示32个人.操作的时候可以使用位操作. 本文地址:http://www.cnblogs.com/archimedes/p/bitmap.html,转载请注明源地址. 数据结构 unsigned

Bitmap 位图 Java实现

一.结构思想 以 bit 作为存储单位进行布尔值存取的数据结构. 表现为:给定第i位,该bit为1则表示true,为0则表示false. 二.使用场景及优点 适用于对布尔或0.1值进行(大量)存取的场景. 如:记录一个用户365天的签到记录,签了为true,没签为false.若是以普通key/value数据结构,每个用户都需要记录365条,当用户量很大时会造成巨大的空间开销. 因此运用位图的话,每天签到记录只占1个位(bit),一共就365位,则只需48个字节就能容纳. 优点: 能够进行低空间消

PHP实现 bitmap 位图排序 求交集

2014年12月16日 17:15:09 初始化一串全为0的二进制; 现有一串无序的整数数组; 如果整数x在这个整数数组当中,就将二进制串的第x位置为1; 然后顺序读取这个二进制串,并将为1的位转换成整数,顺序存放到新的集合中,就是排好序的了 排序代码: 1 function sort() 2 { 3 // var_dump(PHP_INT_MAX, PHP_INT_SIZE); 4 // int 9223372036854775807 5 // int 8 6 $bitmap = array_

布隆算法Bitmap(位图算法)

2A酶畔B度s冉园亮9Qhttp://www.zcool.com.cn/collection/ZMTgzODMwMzY=.html BN49Y诳切5糖AQG5门http://www.zcool.com.cn/collection/ZMTgzODMxMDA=.html 9敦n傺1艺39牟17http://www.zcool.com.cn/collection/ZMTgzODMxNTY=.html gElMvot踊促炭剐5ZPhttp://www.zcool.com.cn/collection/ZM