1.  概述

位图(bitmap)是一种很经常使用的结构,在索引。数据压缩等方面有广泛应用。

本文介绍了位图的实现方法及其应用场景。

2. 位图实现

2014728101320" alt="" style="border:1px solid rgb(204,204,204); padding:3px; max-width:620px; overflow:hidden">

(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://www.jb51.net/article/54438.htm

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

最新文章

  1. phpcms新闻轮播图实现
  2. metasploit模块功能介绍
  3. 从图片加载纹理-使用glut工具
  4. Boost下载安装编译配置使用指南
  5. Python设计模式——设计原则
  6. js select级联,上面分类,下面是内容
  7. 利用java实现一个简单的远程监控程序
  8. BZOJ 1064 假面舞会
  9. php_ThinkPHP的RBAC(基于角色权限控制)详解
  10. Linux 系统管理06--磁盘管理
  11. Java就业企业面试问题-ssh框架
  12. SimpleCursorAdapter和ListView的结合使用
  13. MVC中利用knockout.js实现动态uniqueId
  14. 使用vmware安装ubuntu不能上网
  15. Shell编程-11-子Shell和Shell嵌套
  16. iOS 静态库和动态库(库详解)
  17. vs code 设置工作区背景图片方法
  18. 使用JProfiler做性能分析过程
  19. CodeForces 724G: Xor-matic Number of the Graph
  20. Ext.net中Combobox如何绑定数据库中的值-通用方法

热门文章

  1. Codeforces 771C
  2. mysql触发器的操作
  3. Java—将文件压缩为zip文件
  4. [转帖]c++ 面试整理
  5. CSS——半透明
  6. [Windows Server 2003] 还原SQL Server数据库
  7. 【技术累积】【点】【java】【26】@Value默认值
  8. Web 服务器与应用服务器的区别是什么?
  9. JNI数组操作
  10. Boolean对象与Boolean原始值的区别