什么是bit—map

直面意思:位—映射。

有人翻译成位图。这个词与其真实的意思有点不吻合。

两一方面。位图通常与矢量图在一起说。

本质上,其就是按位映射。

 

 

用途:统计、排序、标识大范围数据。

优势:使用较少的内存。

存储一大片数据。我们习惯上用int数据。或int的堆来做。

 

 

这样太费内存了。

bit-map是一个比较好的方法。

散列也是映射。散列的散列函数是比较灵活饿。可以讲任意key经过处理产生一个散列表上的相应位置。

在散列表的影响位置又存储着一些与key的关联信息。

bit-map是对其的一种弱化,或者是定向使用。

比如我们的数据最大值为N。

那么如果一个bit位对应一个数据的话。(有时候需要多位对应一个数据,这个数据就是小于最大值的key)

则需要占用N个bit位的内存。

 

延伸一下,bit位为一个单元。这个就是说需要N个单元。

 

还有一种应用排序:

所谓的Bit-map就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。

如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0(如下图:)

image

然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0x01<<(i%8)) 当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending),因为是从零开始的,所以要把第五位置为一(如下图):

image

然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:

image

然后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。

【适用范围】

可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下

【基本原理及要点】

使用bit数组来表示某些元素是否存在,比如8位电话号码

【扩展】

Bloom filter可以看做是对bit-map的扩展

【问题实例】

1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。(可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)

2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。

 

<think> 嗯,用户这次想了解bit map的定义,结合之前提供的站内引用来看,用户似乎混淆了"Bit-map"和"BITMAP"两个概念。引用[1]提到的Bit-map是用来排序的数据结构,而引用[2]讨论的是Keil开发中的内存映射文件(MAP文件里的BITMAP区域),这完全是两码事。 用户可能正在学习数据结构或者嵌入式开发。如果是前者,重点要讲清楚位图的核心思想和存储方式;如果是后者,则需要解释内存布局中bit区域的特殊含义。从提问方式看,用户应该更关注数据结构层面的定义,因为特意提到排序的例子。 上次回答时已经区分了两种bit map,这次需要更系统地梳理: 数据结构中的Bit-map本质是位数组,每个bit表示一个数字是否存在,通过bit位置映射数值。比如数字4对应第4位(从0开始计算),用1Byte就能表示0-7的数字存在性。这种结构的优势在于极致压缩空间,但缺点是只能处理无重复整数。 至于内存管理中的bitmap,主要体现在引用[2]描述的51单片机内存分配上。MAP文件显示bit变量会占用20H-2FH的16字节空间,这是由51架构决定的特殊内存区域,和数据结构意义上的bitmap无关。 用户可能被"bit"这个共同字眼迷惑了,需要明确指出这是同名异义。回答结构应该先明确核心定义,再用排序例子说明原理,最后对比嵌入式场景的特殊含义。这样既能解决当前疑问,也能预防后续混淆。 对了,用户引用的资料里那个排序例子很典型,可以拆解成三步:初始化归零→置位存在元素→扫描输出。这个具体过程比抽象解释更直观,应该保留在回答中。另外提问末尾的"定义"是单数形式,但实际需要解释两种定义,这点要在回答开头就说明清楚。 </think> Bit map(位图)的定义根据应用场景有两种核心含义: --- ### **1. 数据结构中的位图(Bit-map)** 用于**高效存储与处理非负整数集合**的数据结构,核心思想是通过二进制位(bit)的0/1标记数值是否存在。 **核心特性**: - **空间压缩**:每个整数仅占1 bit空间(传统数组需4-8字节)。 - **快速操作**:支持$O(1)$时间复杂度的插入、删除和查询。 **定义步骤**(以引用[1]的排序为例): 1. **初始化位数组**:开辟$N$位空间(如$N=8$),所有位初始化为0(如图): ``` 位索引:0 1 2 3 4 5 6 7 位值 :0 0 0 0 0 0 0 0 ``` 2. **映射数值到位**:数值$k$映射到位索引$k$(从0开始)。 - 插入元素{4,7,2,5,3} → 将索引2,3,4,5,7位置1: ``` 索引:0 1 2 3 4 5 6 7 位值:0 0 1 1 1 1 0 1 // 2,3,4,5,7位为1 ``` 3. **输出有序序列**:遍历位数组,输出值为1的索引 → `2,3,4,5,7`。 **应用场景**: - 海量无重复整数排序(如10亿数据仅需约120MB内存) - 布隆过滤器、索引压缩等[^1]。 --- ### **2. 嵌入式系统中的内存位图(BITMAP)** 在Keil C51等嵌入式开发中,**BITMAP指内存中管理位变量(bit)的特殊区域**(引用[2]): - **固定地址范围**:51单片机的bit变量必须存储在`0x20–0x2F`的16字节空间(共128位)。 - **独立于字节变量**: - 字节变量(如`u8`)存储在`0x00–0x7F`(idata区)。 - bit变量单独分配在BITMAP区,定义后强制占用16字节(即使仅用1位)。 - **栈空间冲突风险**:BITMAP区与栈顶(如`0xFF`)相邻,需预留空间防止溢出[^2]。 **内存布局示例**: ``` 地址 内容 0x00-0x07: R0-R7寄存器 0x08: u8变量(字节变量) 0x20: bit变量起始位置 0xFF: 栈顶 ``` --- ### **两种定义的对比** | **特性** | 数据结构中的Bit-map | 嵌入式系统中的BITMAP | |----------------|--------------------------|--------------------------| | **目的** | 高效存储整数集合 | 硬件约束下的位变量存储 | | **空间分配** | 按需动态分配 | 固定地址(20H-2FH) | | **应用领域** | 算法、大数据处理 | 单片机/嵌入式开发 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值