数据结构——bitmap

        最近在看《编程珠玑》这本书。 第1章中引入了bitmap(位图)的数据结构。以前没有接触过, 抽空研究了一下,记录下来。

        书中描述的情景:  

         1. 最多1000万个7位数电话号码(号码不重复,实际大概800万个),保存在文本中 

         2. 每隔一段时间要对号码进行排序

         3.程序模块最多可用1M Bytes的内存, 磁盘空间充足


          分析:

           通常方案:7位电话号码可以用uint32_t (4个字节)来存储,  4 * 8 * 10^6 Bytes约为32M Bytes,一次性排序显然内存不满足。

                               1M Bytes 内存可以存放 10^6/4 = 250万个号码, 1000万个约要分40趟进行读取排序写入文件,在归并到一起

                               此方案,需要40次读原始文本的代价,效率低下。

           位图方案: 1个字节(8Bit)可以存放8个整数,  实际800万个号码,刚好1M Bytes的内存空间可以使用,符合要求。


        一、原理

        通常存储方案, 每个整数(假如4个字节), 占用内存多, 在内存不足或海量数据时, 导致处理方法复杂。

        位图, 可以理解用位(Bit)来表示数据, 1个字节是8位, 可以存储8个连续的整数, 内存空间充分利用。 每一位 1表示有数据, 0 表示没有数据。

        举例说明:   

        整数集合 {1 , 11,  9 , 7 , 10 }

        5个整数,用通常存储方案,需要 5  * 4 = 20 字节 

        位图只需要  12位, 不到2个字节(通常是用2个字节来存放,方便管理和字节对齐)

        这5个整数用位图表示如下࿱

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值