介绍一下bitmap的思想:
情景1:
有些时候我们为了判断一个某个元素是否存在一个集合中,普通的方式是map[int]xxxx存储。数据量小的时候还可以
待数据量庞大的时候,比如我们判断某人的momoid是否在某个Momoid切片中,存储就悲剧了。算一下:
一个int = 4byte 倘若存储500W个数据 4 * 500 * 1000 / 1024 /1024 = 2G的存储,怎么办放弃吧…
改进:
对于这种数字形式存在性问题上完全可以用bit的0,1来确定数字的存在。那么之前的一个int = 32bit 只能存储 1种状态
现在可以存储 32X 个数字状态。瞬间 存储空间降低额32倍。
算法:
设定 : int 为 32 bit
int[] bitmap
1.给定一个整数计算其归属的数组下标,因为是 0 - 31 ,32 - 63 ….为一个整数 很显然下标计算就是
idx = momoid / 32 = momoid >> 5
2,设置改下标 bitmap[ idx ] 对应整数的位标识,很显然,只要对 momoid 对 32 取余即可得到状态位下标
bitIdx = momoid % 32
3. 设置该数的状态, 只要将1<< bitidx 位 再与bitmap[idx] 值求或就可完成
bitmap[idx] = bitmap[idx] | ( 1 << bitidx)
状态位,删除、判断存在性与否 不再赘述了。
好处:
省空间、查询方便
附上实现代码:
var bitmap []uint32 = make([]uint32, MAX)
const (
SHIFT = uint32(5)
MASK = 0x1F
MAX = 1024 * 1024 * 1024
)
/**
* 整数32Bit可表示32个整数是否存在
* 只要将整数除以32既可以得到下标
* 而32位的置位0或1可以直接通过对
* momoid求mod获取对第几位置位
*/
func AddUser(momoid uint32) {
//对32位置位即对momoid进行取mod获得第几位置位
bitmap[momoid>>SHIFT] |= (1 << (momoid & MASK))
}
/**
* 判断是否存在
* 直接取出 第几位判断该位是否为1即可
*/
func ContainUser(momoid uint32) bool {
return (bitmap[momoid>>SHIFT]>>(momoid&MASK))&0x01 == 1
}
/**
* 删除用户
* 把momoid % MASK 位数 设置为 0即可
* 方式下:
* ^(momoid % MASK) & bitmap
*/
func DelUser(momoid uint32) {
bitNum := ^(bitmap[momoid>>SHIFT] & (1 << (momoid & MASK)))
bitmap[momoid>>SHIFT] &= bitNum
}
相关推荐
本篇文章将深入探讨Go语言中的一些基础数据结构封装,包括树(Tree)和位图(Bitmap),以及它们在实际编程中的应用。 一、树数据结构 1. 树的基本概念:树是一种非线性的数据结构,由节点(Vertex)和边(Edge)...
BitmapFont:go 库 位图字体 使用 Golang 的 BitmapFont 解释器 安装 git clone git://github.com/ChaimHong/BitmapFont.git cd 位图字体 进行安装
本项目"Webp格式与Bitmap格式(JPG、PNG、Bmp等)互转 C#Demo"是一个C#实现的示例程序,能够帮助开发者理解和应用WebP格式。该程序兼容x86和x64架构,确保了在不同平台上的兼容性。它包含了完整的源代码以及所需的库...
`iso8583go`是针对Golang语言实现的一个ISO8583消息处理库。本文将深入探讨`iso8583go`库的功能、设计原理以及如何在实际项目中使用它。 首先,`iso8583go`的核心功能是打包和解包ISO8583消息。ISO8583报文结构复杂...
在C#中,可以使用System.Drawing命名空间中的Graphics和Bitmap类来实现。首先,创建一个Bitmap对象,然后使用Graphics对象的DrawString方法将文字绘制到Bitmap上,最后保存为图片文件。例如,你可以创建一个方法,...
Go 开源项目 MIMIO 的对象存储方案在探探的实践分布式分布式事务etcd 的实现原理数据结构与算法基础Dijkstra什么是 Bitmap 算法?Bitmap算法(进阶篇)最小栈的实现判断 2 的乘方找出缺失的整数辗转相除法是什么鬼?...
在Golang中处理图像文件是常见的任务,尤其是对于 BMP(Bitmap)这种常见格式。BMP是一种无损的图像文件格式,通常用于存储位图图像。本文将深入探讨如何使用Go语言来读取和操作BMP文件,以及stdlib中可能存在的问题...
它提供了各种方法,如`PrintNormal`用于普通文本打印,`PrintBarCode`用于打印条形码,`DrawBitmap`用于打印图形等。 2. **ESC/POS 控制序列**:了解如何构建和发送ESC/POS指令,例如设置字体、调整对齐方式、控制...
- **质量压缩**:使用Bitmap的`compress()`方法来调整图片的质量参数。 - **尺寸压缩**:通过计算合适的采样率来减少图片大小。 - **格式选择**:根据应用场景选择不同的图片格式,如JPEG适用于照片,PNG适合透明...
英文版的ISO8583协议可能提供了原始的标准定义,对于深入理解和实现协议的开发者来说尤其有价值。英文版通常会包含更精确的技术细节和规范,有时还会包含一些更新或扩展的标准版本。 阅读和理解ISO8583协议对于开发...
Golang中的底层数据类型和utils。 稳定的低级功能集是强大体系结构的基础。 它注重稳定性,并要求较高的测试覆盖率。 地位 这个项目一直在支持我们所有其他的go项目。 安装 go get github.com/openacid/low/... ...
咆哮 这是Roaring位图数据结构的修订版。 咆哮的位图已被等主要系统以及和 , , , , , , , , , 等派生系统使用和eBay的 。 YouTube SQL引擎使用咆哮位图进行索引。... 为了实现一组整数,位图(也称为位集或
golang 开发,跨平台,可运行在Windows、Mac、Linux。 安装 从github release里下载编译好的执行程序 从源码安装 首先安装golang环境 执行 go get -u -v github.com/qcdong2016/PlistDumper 使用说明 $ PlistDumper ...
结合go语言的特点,大部分数据结构都实现了goroutine-safe。 创建对象时,可以通过配置参数指定是否开启。功能列表数据结构优先队列堆rbtree(red_black_tree) 地图/多地图集/多集位图布隆过滤器hamt(hash_array_...