数据结构之位图(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位图》://www.jb51.net/article/54438.htm
(2)武森《浅谈信息学竞赛中的“0”和“1”》
上一篇:C语言入门之指针用法教程
栏 目:C语言
下一篇:MFC程序对文件的处理方法
本文标题:数据结构之位图(bitmap)详解
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3430.html
您可能感兴趣的文章
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10APUE笔记之:进程环境详解
- 01-10内部排序之堆排序的实现详解
- 01-10进程间通信之深入消息队列的详解
- 01-10海量数据处理系列之:用C++实现Bitmap算法
- 01-10如何求连续几个数之和的最大值
- 01-10C++算法之海量数据处理方法的总结分析
- 01-10深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
- 01-10用代码和UML图化解设计模式之桥接模式的深入分析
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 04-02jquery与jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结