首页 > 其他分享 >位图(bitmap)原理以及实现

位图(bitmap)原理以及实现

时间:2023-09-19 18:11:19浏览次数:31  
标签:index uid 实现 bitmap 原理 bit arrIndex 字节

大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我们在日常开发中常用的算法,并结合实际的应用场景,真正的感受算法的魅力。

今天,我们就来学习下位图bitmap的原理以及作用。

代码已经上传github

https://github.com/HobbyBear/codelearning/tree/master/bitmap

位图作用

bitmap 是一种高效的且占用内存很小的 判断 某个值 存在与否的数据结构。它用二进制的某一位去表示某个值是否存在。

比如我们需要统计10亿用户是否签到,正常的做法是你可以设计一个10亿长度的map,将用户的uid设置为key,是否签到设计为value,假设uid是int64 类型,占用8个字节,10亿用户就需要大约8G的内存 ,而如果 设计成bitmap去存储,则只需要大约125M 。极大的节约了内存。

原理

因为bitmap中用二进制位代表某个uid是否存在,所以一个字节能够代表8个uid是否存在,如下图所示:

image.png

bit位为1代表所在uid的用户已经签到,0则代表未签到。图中,uid为1和5的用户都没有签到,uid为2,3,4,6,7,8的用户都已经签到。

实现

要实现这样一个bitmap,我们可以用一个字节数组来保存所有的bit位,将bit位 设置为1 就是确认某个数字或者说是像例子里的uid,定位uid对应在这个字节数组的哪个位置,将特定位置的字节定位到以后,再定位这个uid在字节中的bit位是在什么位置。

整个过程看代码会更加清晰,如下代码所示,我们在bitmap的构造函数里定义了整个bitmap的最大长度。

type BitMap struct {  
   flags []byte  
}  
  
func New(max int64) *BitMap {  
   flagLen := max/8 + 1  
   return &BitMap{flags: make([]byte, flagLen)}  
}

接着看下它的set方法,找到某个数字index再bitmap中的bit位,将其设置为1,一个字节是8位,通过index/8 得到其bit位是在哪个字节上,通过index%8 取余得到设置的bit位 在字节的第几个bit为上,然后通过或运算将特定bit位设置为1。

func (b *BitMap) Set(index int64) {  
   arrIndex := index / 8  
   offset := index % 8  
   // 将offset位置设置为1,或运算,0 | 1 = 1  1|1= 1, 0|0 =0, 1的| 将原值设置为1 ,0的| 不改变原值  
   b.flags[arrIndex] = b.flags[arrIndex] | (0x1 << offset)  
}

我还定义了Exits 方法快速判断某个值是否被bitmap记录,同样也是先找到index对应的bit位 在数组中的位置,然后通过与运算去判断特定bit位是0还是1。

func (b *BitMap) Exits(index int64) bool {  
   arrIndex := index / 8  
   offset := index % 8  
   res := b.flags[arrIndex] & (0x1 << offset)  
   if res == 0 {  
      return false  
   }  
   return true  
}

除此以外,你还可以定义一个remove方法,用于清除特定bit位上的值,

func (b *BitMap) Clean(index int64) {  
   arrIndex := index / 8  
   offset := index % 8  
   // 0 & 1 = 0 ,0 & 0 = 0, 1&1 =1  1的& 不会改变原来的值, 0的& 将原值变为0  
   b.flags[arrIndex] = b.flags[arrIndex] & ^(0x1 << offset)  
}

你可以看到bitmap用到的位运算其实本质上是用到下面的性质:

1, 1 与 0或者 1的 & 运算不会改变原值, 0 的& 会将特定bit位设置为0。
2, 0的或运算 不会改变原来的值, 1的或运算是将原来的bit位设置为1。

整个实现并不难,但这种结构的确在大数据量下达到了节约内存进行排重的目的,后续讲到的布隆过滤器也是在这种数据结构上实现的。

标签:index,uid,实现,bitmap,原理,bit,arrIndex,字节
From: https://www.cnblogs.com/hobbybear/p/17715423.html

相关文章

  • import cv2是什么意思:使用Python的OpenCV库实现图像处理
    importcv2是Python中的一个库函数,用于加载和使用OpenCV库。OpenCV是一个开源的计算机视觉库,可以用来进行图像处理、计算机视觉和机器学习等操作。importcv2是Python中的一个库函数,用于加载和使用OpenCV库。OpenCV是一个开源的计算机视觉库,可以用来进行图像处理、计算......
  • 穿越人海遇见你:Mobpush是如何实现智能化精准投放的
    精准投放的概念由来已久,在这个“内容为王”的信息爆炸时代,已经不仅仅是用户在单向的凭着自己的喜好筛选推送,同时也是推送运营者在主动的根据推文内容筛选其潜在的受众,对客户在收入、消费习惯、年纪、兴趣爱好的了解越多,就越可能激发用户点击推送的兴趣,从而提升成交转化率,实现推送投......
  • sql server单一某列实现排序____附件数据表
    USE[YJ]GO/******Object:Table[dbo].[T_OA_WDSTORE]ScriptDate:04/16/201400:23:38******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOSETANSI_PADDINGONGOCREATETABLE[dbo].[T_OA_WDSTORE]( [WDBH][nvarchar](50)NOTNULL, [APPBH][nvarc......
  • 1. illumina测序原理
    本人的生物水平只有高中且4年没碰的水平,如果涉及生物的笔记没写对请见谅.1.一个典型的生物信息分析  我们在做生物信息分析时,常常是有一个目的,比如分析为什么某朵花是红色的.假设我们在做转录组数据分析,流程一般如下图所示:  得到数据后,我们会进行标准分析,得到一些......
  • WorkPlus打造企业移动门户,实现高效协作与便捷访问
    在移动互联网的时代,企业对于高效的协作和便捷的访问需求日益增长。WorkPlus作为领先品牌,致力于打造企业移动门户,帮助企业实现高效协作与便捷访问。本文将重点介绍WorkPlus如何通过创新的解决方案,为企业提供定制化的企业移动门户,提升工作效率和用户体验。一、企业移动门户的重要性:企......
  • 【HarmonyOS】元服务卡片router实现跳转到指定页面
    ​【关键字】元服务卡片、router跳转不同页面 【写在前面】本篇文章主要介绍开发元服务卡片时,如何实现从卡片中点击事件跳转到指定的应用内页面功能。此处以JSUI开发服务卡片为例,JS卡片支持组件设置action,包括router事件和message事件,其中router事件用于应用跳转,message事件......
  • Spring Boot + Disruptor 实现消息队列,告诉你什么叫快、什么叫高效!
    01、背景工作中遇到项目使用Disruptor做消息队列,对你没看错,不是Kafka,也不是rabbitmq;Disruptor有个最大的优点就是快,还有一点它是开源的哦,下面做个简单的记录.02、Disruptor介绍Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题......
  • 实现连续对话,人机交互更自然
    随着科技的快速发展,人工智能领域取得了突破性的进步。最近,一种名为ChatGPT的人工智能模型因其能够实现“连续对话”机制而备受瞩目。这种技术的出现改变了传统搜索引擎和聊天机器人的工作方式,让人们能够更自然地与计算机进行交互。ChatGPT是一种基于深度学习的自然语言处理模型,它能......
  • sql server单一某列实现排序
    WDBHAPPBHWDMC430175500443659sg430044033903992转发省环境保护厅省财政厅关于印发广东省排污权有偿使用和交易试点管理办法的通知(会签文)(修改).doc430175500443659430044033903992转发省环境保护厅省财政厅关于印发广东省排污权有偿使用和交易试点管理办法的通知(会签文).doc......
  • 63基于java的图书商城管理系统设计与实现(配套lun文,可参考做毕设)
    本章节给大家带来一个基于java图书商城管理系统设计与实现,网上图书商城的管理系统,网上商城,在线图书信息管理系统,上线图书商城,网上图书商城。引言随着时代的发展,越来越多的人开始寻求一种更加有效的管理方案,而普通用户往往受到管理经验的限制。这时,图书商城网站的出现,使得图书信......