位图

  位图(Bitmap)是通过一个 bit 来表示某个元素对应的值或者状态。它并不是什么新的数据结构。它的内容其实就是普通的字符串。

  在redis中,我们可以通过 get/set 获取位图的内容,也可以使用 getbit/setbit 操作 bit 值(0 或者 1)。

  Bit即比特,是目前计算机中数据最小的单位。

  8个Bit一个Byte(字节)。Bit的值,要么为 0 ,要么为 1。

  由于Bit是计算机中最小的单位,使用它进行储存将非常节省空间。特别适合一些数据量大的场景。例如,统计每日活跃用户、统计每月打卡数等统计场景。

可以看出,上图中,将b、i、g各自的ASCII值用1byte来存储,redis中能够用命令来修改每一个bit的值(0或1)

位向量

  与位图存储不同之处在于,位向量注重偏移量和存储索引

  例如如何利用位向量向集合中插入值呢?

  

  如何利用位向量判断值A是否存在呢?

  1. 值A的索引要存在,例如在位向量中,集合中最大值的索引之后是没有存储变量的,所以也要对A分割出索引index和偏移offset,如果index>集合长度,则认为不存在

  2. 判断了索引还需要判断片偏移,将1<<offset的结果与索引位上的值逐位相&(与),若为1则集合中存在A。

// 集合
type UintSet struct {words []uint64
}// 向bitmap插入数据
func (s *UintSet) AddEle (x int)  {index, offset := x/64, uint(x%64)for index >= len((*s).words) {(*s).words = append(s.words, 0)}bitVal := uint64(1 << offset)(*s).words[index] = bitVal
}// 向bitmap查找数据
func (s *UintSet) find(ele int) bool {index, offset := ele/64, uint(ele%64)return index < len((*s).words) && s.words[index]&(1<<offset)!=0
}

  

  

转载于:https://www.cnblogs.com/kisun168/p/11550358.html

Golang 位向量相关推荐

  1. Golang练手小项目系列

    Golang练手小项目系列 本系列整理了10个工作量和难度适中的Golang小项目,适合已经掌握Go语法的工程师进一步熟练语法和常用库的用法. golang练手小项目系列(1)-位向量 golang练 ...

  2. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  3. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

  4. CentOS Docker安装配置部署Golang web helloworld

    目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker部署Golang web helloworld 四.Docker与虚拟机的区别 五. ...

  5. 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发

    基于Golang pmlpml/RxGo程序包的二次开发[阅读时间:约20分钟] 一.ReactiveX & RxGo介绍 1.ReactiveX 2.RxGo 二.系统环境&项目介绍 ...

  6. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

    目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...

  7. 基于Golang的对象序列化的程序包开发——myJsonMarshal

    基于Golang的对象序列化的程序包开发--myJsonMarshal[阅读时间:约10分钟] 一.对象序列化概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体程序设计及 ...

  8. 【golang程序包推荐分享】go-ini、viper、godoc

    [golang程序包推荐&分享]go-ini.viper.godoc 一.go-ini 1.程序包简介 2.下载安装 3.简单使用[截取自官网] 二.viper 1.程序包简介 2.下载安装 ...

  9. 基于Golang的监听读取配置文件的程序包开发——simpleConfig_v1

    基于Golang的监听&读取配置文件的程序包开发--simpleConfig_v1 [阅读时间:约10分钟] 一.配置文件概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 ...

最新文章

  1. 前锋 php 杭州,前锋php培训
  2. java读取hdfs文件夹_HDFS 读取、写入、遍历文件夹获取文件全路径、append
  3. 工业机器人的下一个竞争焦点已经非常明确:通用人工智能(AGI)
  4. 在ueditor编辑器的光标停留处插入内容
  5. ACM-最短路之中的一个个人的旅行——hdu2066
  6. python分糖果_分糖果_平安科技笔试题_牛客网
  7. 假设磁盘块与缓冲区大小相同,每个盘块读入缓冲区的时间为10μs,由缓冲区送至用户区的时间是5μs,系统对每个磁盘块数据的处理时间为2μs。若用户需要将大小为10个磁盘块的
  8. 前端学习(3090):vue+element今日头条管理-参数传递
  9. 投标报价得分计算程序_什么是投标报价?怎么计算呢?
  10. 还在为运维烦恼?体验云上运维服务,提意见赢好礼!【华为云分享】
  11. java unsafe 详解_Java CAS操作与Unsafe类详解
  12. 基数排序(也叫桶子排序)
  13. 在html中如何写图片渐变,如何通过CSS3实现背景图片色彩的梯度渐变_html/css_WEB-ITnose...
  14. 基于eNSP的校园网设计的仿真模拟
  15. ps替换png图标的背景色
  16. 计算机研究生论文多少字,研究生一篇论文需要多少字?
  17. 未明学院:被腾讯群面虐完后,我找到了未来的方向…
  18. 基于android的资讯阅读APP
  19. 4.5.2 地址变换机构 4.5.3  访问内存的有效时间
  20. 第五章: 项目范围管理

热门文章

  1. C语言如何用fopen创建可读写txt
  2. Mutable and Immutable Variables in Python
  3. PHP关闭$_ENV后获取服务器参数的办法
  4. ELK笔记(一)elasticsearch安装
  5. juniper srx 3400 双机 配置
  6. SQL 中存放 varbinary型数据
  7. [Python] L1-038. 新世界 团体程序设计天梯赛GPLT
  8. LeetCode 49. Group Anagrams
  9. 蓝桥杯 ADV-78 算法提高 最长单词
  10. PAT 乙级 1023. 组个最小数 (20) Java版