c/c++ 数据结构之位图(bitmap)具体解释

news/2024/7/7 8:29:03

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://www.jb51.net/article/54438.htm
(2)武森《浅谈信息学竞赛中的“0”和“1”》





http://www.niftyadmin.cn/n/2095078.html

相关文章

《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.2 将比赛结果表读入R中...

本节书摘来自华章计算机《数据科学R语言实践&#xff1a;面向计算推理与问题求解的案例研究法》一书中的第2章&#xff0c;第2.2节,作者&#xff1a;[美] 德博拉诺兰&#xff08;Deborah Nolan&#xff09;  邓肯坦普朗&#xff08;Duncan Temple Lang&#xff09;  更多章…

一段批处理代码

echo off mode con: cols60 lines3color 1a ::分离 时间&#xff0c;&#xff5e;5&#xff0c;2 表示从第五位开始&#xff0c;显示后2位字符。SET date1%date:~0,4% SET date2%date:~5,2% SET date3%date:~8,2% ::分离 时间SET time1%time:~0,2% SET time2%time:~3,2% SET…

XP系统安装后常规设置

XP系统安装后常规设置 一般我在新装完系统之后重要作下面的事情&#xff1a;显示文件扩展名&#xff0c;关闭简单共享、系统还原、远程协助错误报告等等&#xff0c;在桌面上显示我的文档和我的电脑&#xff0c;添加自己喜欢的字体等等&#xff0c;这个批处理我放进了安装光盘中…

面向对象原则之一 接口隔离原则

面向对象原则之一 接口隔离原则 前言 面向对象有人分为五大原则&#xff0c;分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则。 也有人分为六大原则&#xff0c;分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则、迪…

常见的编码陷阱3

常见的编码陷阱 6.避免三元冗余在JavaScript和PHP中&#xff0c;过度使用三元语句是很常见的事情&#xff1a;1 //javascript2 returnfoo.toString()!""?true:false;3 //php4 return(something())?true:false;条件判断的返回值永远…

黑客来袭,怎么保护我们的网络安全?

前阵子来势汹汹的勒索病毒“想哭”&#xff08;WANNA CRY&#xff09;&#xff0c;让很多网友们感慨&#xff1a;原来黑客真的就在身边&#xff01; 让大家记忆深刻的是&#xff1a;“想哭”病毒不仅在一天之内勒索了全球100多个国家的10万台电脑&#xff0c;包括高校内网、政府…

Apeiron公司展示“火箭级”英特尔Optane阵列技术

“Optane已经被串连起来&#xff0c;而非作为孤立组件存在。” Aperion公司发布的一款Optane阵列拥有五倍于原Apeiron闪存阵列之数据吞吐能力、六倍以上IOPS以及高达38倍的延迟削减效果。 在一项技术演示中&#xff0c;Apeiron方面将其配备有NVMe闪存驱动器的ADS1000存储阵列与…

2013年CISA考试知识点变化总结讲义

为什么80%的码农都做不了架构师&#xff1f;>>> 2013年CISA考试知识点变化总结讲义 CISA(Certified Information Systems Auditor简称&#xff0c;中文为国际信息系统审计师&#xff09;认证是由信息系统审计与控制协会ISACA(Information Systems Audit and C…