zoukankan      html  css  js  c++  java
  • Golang 位向量

    位图

      位图(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
    }

      

      

  • 相关阅读:
    五一拆装机学习
    msgbox函数和inputbox函数应该注意的几点
    西游记(3)
    刚刚开通csdn
    c# 快捷键
    JavaBean的属性(Simple,Indexed,Bound,Constrained)【收藏】
    SQL查询语句使用【收藏】
    .NET 对实现IPersistStream接口的对象进行保存和读取
    创建控件数组
    常用数据库JDBC连接写法【收藏】
  • 原文地址:https://www.cnblogs.com/kisun168/p/11550358.html
Copyright © 2011-2022 走看看