首页 > 其他分享 >Bitmap的巧用

Bitmap的巧用

时间:2025-01-16 22:54:17浏览次数:1  
标签:00 bitIndex 标签 用户 Bitmap 巧用 size

题目

关于用户标签的需求:用户标签包括用户的社会属性、生活习惯、消费行为等信息。例如,程序员,有驾照,单身等等。通过用户标签,可以对多样的用户群体进行统计。例如,统计用户的男女比例,统计喜欢旅游的用户数量等。

通常的思路,是使用关系型数据库,比如Occupation表示用户职位,gender表示性别等等。表的一行记录,为一个用户的标签。但是如果有很多标签的话,则需要给表加很多列,不好维护。

思路

Bitmap算法,在中文里又叫作位图算法。位图,是指内存中连续的二进制位(bit),所组成的数据结构,该算法主要用于大量整数做去重和查询操作。

举例,有100bit的Bitmap,每一个bit位都表示着,从0到99的整型数。如果想用bit位,表示某些数字,只需将对应位的bit设置位1即可。例如,向100bit的Bitmap中,保存55,77,88,只需要将对应位设置为1即可。

这样,就可以用Bitmap和用户表里的id建立映射关系,假如一个程序员标签,有一个用户的id位99,只需要将表示程序员标签的Bitmap的第99位,设置为1,就表示id为99的用户职位是程序员。

还可以,进行与,或,异或等逻辑运算。

假设,有两个10bit的Bitmap,一个表示是男性的标签{0,0,0,0,0,0,1,1,1,0},一个表示是00后的标签{0,0,0,0,0,0,0,0,1,0},求这10bit的Bitmap中,即是男性,也是00后的用户,进行逻辑&运算即可,或就进行|元素。非00后,就需要代表00后的标签和,全部的用户的Bitmap,进行异或运算,就是说,在全部用户的Bitmap中过滤掉是00后的即可。

代码

public class MyBitmap {
    //每一个word是一个long类型元素,对应一个64位二进制
    private long[] words;
    //Bitmap的总位数大小
    private int size;

    public MyBitmap(int size){
        this.size = size;
        this.words = new long[(getWordIndex(size - 1) + 1)];
    }

    /**
     * 获取Bitmap某一位的状态
     * @param bitIndex 位图的第bitIndex位
     */
    public boolean getBit(int bitIndex){
        if(bitIndex < 0 || bitIndex > size - 1)
            throw new IndexOutOfBoundsException("超过Bitmap有效范围");
        int wordIndex = getWordIndex(bitIndex);
        return (words[wordIndex] & (1L << bitIndex)) != 0;
    }

    /**
     * 把Bitmap某一位设置为true
     */
    public void setBit(int bitIndex){
        if(bitIndex < 0 || bitIndex > size - 1)
            throw new IndexOutOfBoundsException("超过Bitmap有效范围");
        int wordIndex = getWordIndex(bitIndex);
        words[wordIndex] |= (1L << bitIndex);
    }

    /**
     * 获取某一个Bitmap对应的word
     * @param bitIndex 位图的第bitIndex位
     */
    private int getWordIndex(int bitIndex){
        return bitIndex >> 6;// bitIndex / 64
    }

    public static void main(String[] args) {
        MyBitmap myBitmap = new MyBitmap(128);
        myBitmap.setBit(126);
        myBitmap.setBit(75);
        System.out.println(myBitmap.getBit(126));
        System.out.println(myBitmap.getBit(78));
    }

}

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

标签:00,bitIndex,标签,用户,Bitmap,巧用,size
From: https://www.cnblogs.com/changming06/p/18675887

相关文章

  • 【WPF】使用RenderTargetBitmap截图的时候位置出现偏移的一些解决办法
    简介在WPF中,如果你需要把控件的渲染画面保存到图片,那么唯一的选择就是RenderTargetBitmap。不过,RenderTargetBitmap是个比较难伺候的主,有时候你以为能工作,但实际上不能;你以为能够正常截图,但实际上截出来的图片是歪的。所以,我总结一下自己项目中遇到的坑和解决办法吧!保存的图片......
  • keycloak~巧用client-scope实现token字段和userinfo接口的授权
    keycloak中的client-scope允许你为每个客户端分配scope,而scope就是授权范围,它直接影响了token中的内容,及userinfo端点可以获取到的用户信息,这块我们可以通过自定义scope/mapper,来实现粒度的控制,并且这个mapper可以控制添加到token,或者添加到userinfo端点,这两块配置也是独立的,下面......
  • 巧用VTable打造炫酷金字塔图表
    在数据分析和可视化领域,表格是展示数据直观、有效的方式之一。今天,就让我们来探索如何利用VTable这个强大的表格组件,制作出既美观又富有信息量的金字塔图表,以及深入了解VTable中各种单元格类型的使用方法,让你的表格也能“绘”出精彩图表!用VTable实现人口金字塔 人口金字塔是......
  • Canvas->Bitmap绘制
    Canvas.drawBitmap常用重载方法的详解/***如果绘制的Bitmap不需要拉伸,缩放,使用这个方法,比如绘制马赛克底图**@parambitmap要绘制的位图*@paramleft被绘制的位图左侧的位置*@paramtop被绘制的位图顶部的位置*@parampaint用于绘制位图的Paint(可以......
  • 有压缩格式的Bitmap(BMP)图像显示调色板数据和图像数据
    有压缩格式的BitmapBMP图像显示调色板数据和图像数据参考文章一、测试代码二、测试结果三、调色板数据四、图像数据参考文章Bitmap(BMP)图像信息验证Bitmap(BMP)图像信息分析主要说明带压缩的形式一、测试代码intmain(intargc,char*argv[]){u32Colo......
  • 如何使用canvas绘制Bitmap?
    在前端开发中,canvas是HTML5提供的一个强大的元素,它允许我们使用JavaScript在网页上绘制图形。不过,canvas本身并不直接支持“Bitmap”这个术语,它主要处理的是像素数据。Bitmap通常指的是位图,即一种由像素点组成的数字图像。在前端开发中,我们通常使用图片(如PNG、JPG等格式)......
  • 面试攻略:巧用电力行业项目经历,点亮你的求职路
    企业管理类企业资源规划系统(ERP):整合电力公司内部各个部门的资源与信息,实现企业内部各项业务的流程优化和资源统一分配,包括财务管理、人力资源管理、物资管理等模块.财务管理系统:管理和监控企业的财务状况,涵盖会计科目管理、应收应付和资金流动跟踪以及财务报告生成等功能.人力......
  • 面试攻略:巧用金融行业项目经历,点亮你的求职路
    银行核心业务系统核心银行系统(CBS):处理客户的储蓄、贷款、支付等基本业务,是银行运营的关键系统,涵盖客户信息管理、账户管理、交易处理、总账管理等功能,确保交易的准确性和资金的安全流转。信贷管理系统(LMS):用于银行对贷款业务的全流程管理,包括客户信用评估、贷款申请审批、额度管......
  • MFC中CBitmap、CBrush、CFont、CPalette、CPen、CRgn删除GDI对象问题
    CBitmap、CBrush、CFont、CPalette、CPen、CRgn均继承自CGdiObject,CDI对象属于CGdiObject,在该类的析构函数中会释放,因此CBitmap、CBrush、CFont、CPalette、CPen、CRgn不必要显式调用DeleteObject()。如果GDI对象在在堆上分配的,则在特定时刻需要删除它,以便执行其析构函数。参考:......
  • 巧用mask属性创建一个纯CSS图标库
    说明mask是CSS中的一个属性,它允许开发者在元素上设置图像作为遮罩层。这个属性的强大之处,在于它可以接受多种类型的值,包括关键字值、图像值、渐变色,甚至可以设置多个属性值。SVG(ScalableVectorGraphics,可缩放矢量图形)是一种基于XML的图像格式,用于定义二维图形。与传统的位......