`
blackbeans
  • 浏览: 141612 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

golang之路--bitmap 实现

 
阅读更多

介绍一下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

}

分享到:
评论
1 楼 hardPass 2013-05-31  
引用
算一下:
一个int = 4byte  倘若存储500W个数据 4 * 500 * 1000  / 1024 /1024 = 2G的存储,怎么办放弃吧…


大锅,500W个数据 是多少啊? 应该是5,000,000

4* 5 * 1000 * 1000 Byte = 20MB?

相关推荐

    Go-Golang一些基础数据结构的封装比如treebitmap等

    本篇文章将深入探讨Go语言中的一些基础数据结构封装,包括树(Tree)和位图(Bitmap),以及它们在实际编程中的应用。 一、树数据结构 1. 树的基本概念:树是一种非线性的数据结构,由节点(Vertex)和边(Edge)...

    BitmapFont:使用 Golang 的 BitmapFont 解释器

    BitmapFont:go 库 位图字体 使用 Golang 的 BitmapFont 解释器 安装 git clone git://github.com/ChaimHong/BitmapFont.git cd 位图字体 进行安装

    Webp格式与Bitmap格式(JPG、PNG、Bmp等)互转 C#Demo

    本项目"Webp格式与Bitmap格式(JPG、PNG、Bmp等)互转 C#Demo"是一个C#实现的示例程序,能够帮助开发者理解和应用WebP格式。该程序兼容x86和x64架构,确保了在不同平台上的兼容性。它包含了完整的源代码以及所需的库...

    iso8583go:golang的打包和解包iso8583消息

    `iso8583go`是针对Golang语言实现的一个ISO8583消息处理库。本文将深入探讨`iso8583go`库的功能、设计原理以及如何在实际项目中使用它。 首先,`iso8583go`的核心功能是打包和解包ISO8583消息。ISO8583报文结构复杂...

    文字转成图片,图片比较相似值,日期处理类库

    在C#中,可以使用System.Drawing命名空间中的Graphics和Bitmap类来实现。首先,创建一个Bitmap对象,然后使用Graphics对象的DrawString方法将文字绘制到Bitmap上,最后保存为图片文件。例如,你可以创建一个方法,...

    blog:算法,WebRTC,节点,微服务,Golang,ELK,Kubernetes,Istio,JAVA,PHP,MongoDB,Ningx,OpenResty,GraphQL ..

    Go 开源项目 MIMIO 的对象存储方案在探探的实践分布式分布式事务etcd 的实现原理数据结构与算法基础Dijkstra什么是 Bitmap 算法?Bitmap算法(进阶篇)最小栈的实现判断 2 的乘方找出缺失的整数辗转相除法是什么鬼?...

    bmp:go 包读取 bmp 图像文件(更多格式和对 stdlib 的修复),golang

    在Golang中处理图像文件是常见的任务,尤其是对于 BMP(Bitmap)这种常见格式。BMP是一种无损的图像文件格式,通常用于存储位图图像。本文将深入探讨如何使用Go语言来读取和操作BMP文件,以及stdlib中可能存在的问题...

    ESC/POS 打印Domo(Vs2005)

    它提供了各种方法,如`PrintNormal`用于普通文本打印,`PrintBarCode`用于打印条形码,`DrawBitmap`用于打印图形等。 2. **ESC/POS 控制序列**:了解如何构建和发送ESC/POS指令,例如设置字体、调整对齐方式、控制...

    百度校园招聘历年经典面试题汇总:Android岗

    - **质量压缩**:使用Bitmap的`compress()`方法来调整图片的质量参数。 - **尺寸压缩**:通过计算合适的采样率来减少图片大小。 - **格式选择**:根据应用场景选择不同的图片格式,如JPEG适用于照片,PNG适合透明...

    ISO8583协议(中英文版都有)

    英文版的ISO8583协议可能提供了原始的标准定义,对于深入理解和实现协议的开发者来说尤其有价值。英文版通常会包含更精确的技术细节和规范,有时还会包含一些更新或扩展的标准版本。 阅读和理解ISO8583协议对于开发...

    low:Golang中的底层数据类型和utils

    Golang中的底层数据类型和utils。 稳定的低级功能集是强大体系结构的基础。 它注重稳定性,并要求较高的测试覆盖率。 地位 这个项目一直在支持我们所有其他的go项目。 安装 go get github.com/openacid/low/... ...

    咆哮:Go(golang)咆哮位图

    咆哮 这是Roaring位图数据结构的修订版。 咆哮的位图已被等主要系统以及和 , , , , , , , , , 等派生系统使用和eBay的 。 YouTube SQL引擎使用咆哮位图进行索引。... 为了实现一组整数,位图(也称为位集或

    PlistDumper:TexturePacker 拆图工具,从 plistjsonfntatlas文件中导出图片

    golang 开发,跨平台,可运行在Windows、Mac、Linux。 安装 从github release里下载编译好的执行程序 从源码安装 首先安装golang环境 执行 go get -u -v github.com/qcdong2016/PlistDumper 使用说明 $ PlistDumper ...

    gostl:go的数据结构和算法库,旨在提供类似C++ STL的功能

    结合go语言的特点,大部分数据结构都实现了goroutine-safe。 创建对象时,可以通过配置参数指定是否开启。功能列表数据结构优先队列堆rbtree(red_black_tree) 地图/多地图集/多集位图布隆过滤器hamt(hash_array_...

Global site tag (gtag.js) - Google Analytics