【HBZ分享】java中的BitSet 与 Redis中的BitMap 与 布隆过滤器

news2024/9/22 1:07:49

BitMap的存储原理

  1. bitMap他会标识出某个整数是否存在,存在即为1,不存在对应位即为0
  2. bitMap是存储int类型的,int = 4byte, 1byte = 8bit,因此bitMap数组中的每个下标可以标识出32个数字是否存在
  3. bitMap相当于一个个小格子,底层是一个int类型数组,数组的每个下标可以存储32个数字,如果bitMap的长度设置为100,则可以标识出100 * 32 = 3200 个数字是否存在
  4. 假设现在有数字【0, 10, 24, 50】那么0会保存到下标为0的那个位,10会保存下标为10的位置,24会保存下标是24的位置,50会保存下标是50的位置,即假设bitMap中第 30个位置对应值 = 1, 则表示30这个数字是存在的
  5. bitMap不能存储【负数,float,double】等非正整数的数字。
  6. bitMap以32位的倍数出现,即我们要存50这个数字,则bitMap总共size就是64,因为50大于32,但小于64,所以需要两个空间存储,即size = 64
  7. bitSet是java中的类型,他的底层是Long存储的,所以它是以64位为一个整体,bitSet中每个数组位可以标识64个数字,同理也不能出现【负数,fload, double】类型
  8. 注意:bitMap可以标识字符串和对象,但是必须要先进行hash取模,然后再存,由于是hash取模,所以存储字符串 或 对象会出现hash碰撞,导致不准确的情况出现

BitMap 与 BitSet的使用场景

  1. 用户签到登录,签到的用户根据自增id,在对应位上打上1的标识
  2. 统计uv,即有多少人访问了网站,把访问网站的用户id打到对应标识位上置1, 最后统计bitMap中为1的个数即可
  3. 领取优惠券,每人只能领取1次,领取的人把id打到对应bitMap位置上置1,领取前根据该用户id查询bitMap是否为1,如果为1,则直接拒绝,因为已经领取了

java中BitSet的使用方式及常用API

package bitmap;


import java.util.BitSet;

/**
 * 要求: 有1千万个随机数,分布在1 到 1亿之间,需要找出1 到 1亿不存在的数据,即随机剩下的9千万数据
 *
 * 使用java的bitSet集合
 *
 * bitSet是Long类型,每一个组是64bit
 * bitMap是int类型,每一个组32bit
 *
 * 注意:bitSet不能存负数,只能存0以上的并且在Long类型范围内的正整数
 */
public class BitSetTest {

    public static void main(String[] args) {

        // 这个初始化128,会在里面生成一个128个桶的Long类型的数组,所以一共有128 * 64 个bit位,也就是一共能标记出128 * 64个整数是否存在
        // 不指定默认64
        BitSet bitSet = new BitSet(128);
        bitSet.set(0);
        bitSet.set(66);


        // 输出bitSet大小,应该是128,因为66大于64,所以需要第二个Long位,每个Long位是64,2个就是128
        System.out.println("bitSet大小: " + bitSet.size());
        // 这个是bit位的长度,是最大的那个数字+1,即67
        System.out.println("bitSet长度: " + bitSet.length());
        // 查询出有多少个为1的位,显然我们只存了0和66,只有俩,所以结果就是2
        System.out.println("bitSet中存在多少数字" + bitSet.cardinality());
        // 读取bit位 = 0的下标, 返回true,说明存数据了,即该位的值 = 1,因为bitSet.set(0),
        // 把0存到了第0位,这是必然的,0一定是存到下标位0的位置,这是规则,不需要认为指定
        System.out.println("0是否存在: " + bitSet.get(0));
        // 读取bit位 = 1的下标,返回false, 说明该位没有存数据,即没有存数字1,所以该位的值 = 0, 表示1这个数字不存在
        System.out.println("1是否存在: " + bitSet.get(1));
        System.out.println("66是否存在: " + bitSet.get(66));


    }
}

输出:
在这里插入图片描述

布隆过滤器

  1. 布隆过滤器可以支持多种类型,而bitSet 和 bitMap只能支持正整数
  2. 布隆过滤器本身不支持删除元素,因为可能出现好几个值由于hash碰撞都存到了同一个格子,如果删除可能会影响到其他元素。
  3. 当然可以把布隆过滤器改造成带有计数的效果,即如果某个格子计数是1,即只有一个元素占有这个位置,这个时候就可以删除
  4. 布隆过滤器保存某个值的时候可以通过多次hash,比如把"java"进行3次不同的hash算法取模,会得到3个不同的hash值,那么这3个值都会保存到布隆过滤器对应的位中,即"java"这个值会被存到3个位置,这3个位置都标记这"java"的hash
  5. 布隆过滤器说没有,那一定就不存在;但是布隆过滤器说存在,那未必真的存在,因为可能发生hash碰撞,导致你要查的元素hash的值和别的元素hash值相同了,这个时候布隆过滤器会误判成存在

布隆过滤器是如何降低误判

  1. 保存元素时,会对该元素去多个hash值,把这些hash值全部存到布隆过滤器中(比如要存"java", 进行3次hash后值分别是【2,10,26】, 那么"java"这个值就会被同时存储到【2, 10, 26】的位置)
  2. 当要查询一个元素是否存在时,会以同样的hash算法计算出3个值,然后用这3个值去布隆过滤器的对应3个位置去找,如果这3个位置有一个位置是0,则直接判该值不存在(假如之前只存了"java", 现在要查询"web"这个字符串是否存在, 那么会以同样的hash算法对"web"进行3次hash取模,假如取到的是【2, 15, 26】, 会发现15这个位置是0,此时直接回判定"web"不存在,尽管2, 26都有,但15没有,就说明"web"不存在)
  3. 当布隆过滤器中的bit格子被逐渐被占满时候,此时即使hash取3个值,依然会有大概率误判,因为可能hash出来的3个值都和其他元素发生hash碰撞了(比如要查询"cloud", 取模是【10, 15, 26】, 而布隆过滤器并没有"cloud", 而10, 15, 26却都是1,因为与"java", “web"发生hash碰撞了,所以会误判"cloud"也存在,而实际却并不存在"cloud”)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/888028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】二叉树的链式结构的实现 -- 详解

一、前置说明 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习。 typedef char BTDataType;typedef struct Binar…

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——模态——-句式转换+性质

文章目录 第三节 模态命题-句式转换性质题-模态命题-句式转换性质-句式转换-逻辑转换:①不一定不可能;②不一定可能不未必。句式转换-语文转换:①一定不可能不必然;②一定不不可能必然不。性质-两命题间的关系-包含:①…

c语言——计算两个数的乘积

//计算两个数的乘积 #include<stdio.h> #include<stdlib.h> int main() {double firstNumber,secondNumber,product;printf("两个浮点数&#xff1a;");scanf("%lf,%lf",&firstNumber,&secondNumber);productfirstNumber*secondNumber…

shell scripts 学习记录

shell scripts 学习记录 1. 环境变量的使用2. Shell中的数组使用Array关联数组 (理解为python中的字典) 3. shell中的基本运算符4. shell 中流程控制语法case...esac使用 5. 函数定义与调用5.1 带返回值的函数5.2 带传参数的函数 6. shell 中的输入/输出重定向6.1 输出重定向6.…

糖尿病视网膜病变,黄斑病变,年龄相关检测研究(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

sCrypt于8月12日在上海亮相BSV数字未来论坛

2023年8月12日&#xff0c;由上海可一澈科技有限公司&#xff08;以下简称“可一科技”&#xff09;、 临港国际科创研究院发起&#xff0c;携手美国sCrypt公司、福州博泉网络科技有限公司、复旦大学区块链协会&#xff0c;举办的BSV数字未来论坛在中国上海成功落下帷幕。 本次…

好消息!多地明确鼓励提取公积金作首付

大家好&#xff01; 我是老洪&#xff0c;看到一则公积金资讯&#xff0c;聊两句。 据媒体报道&#xff0c;多地明确鼓励提取公积金作首付。 我个人觉得鼓励提取公积金作首付&#xff0c;对于购房者来说挺好的。 这种做法不仅可以减轻首付资金压力&#xff0c;还可以提高购房者…

出现丢包问题的情况以及解决方法

为什么会出现丢包&#xff1f; 我们在网络上传输数据的时候&#xff0c;数据需要经过很多的路由器/交换机&#xff08;交通枢纽&#xff09;进行传输&#xff0c;而路由器/交换机的结构是很复杂的&#xff0c;传输的数据量也是不确定的&#xff0c;可能这一会传输的数据比较少&…

mysql 03.查询(重点)

先准备测试数据&#xff0c;代码如下&#xff1a; -- 创建数据库 DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb; USE mydb;-- 创建student表 CREATE TABLE student (sid CHAR(6),sname VARCHAR(50),age INT,gender VARCHAR(50) DEFAULT male );-- 向student表插入数据…

vscode用ssh远程连接linux

1、vscode是利用ssh远程连接linux的&#xff0c;所以首先确保vscode已经安装了这两个插件 2、点击左下角的连接 3、选择Connect to Host…… 5、按格式输入 ssh 主机名ip 比如我的&#xff1a;ssh mnt192.168.198.128 6、选择第一个打开配置文件&#xff0c;确保输入正确 7、…

el-table :span-method合并单元格

2023.8.17今天我学习了如何使用el-table进行单元格的合并&#xff0c;效果如下&#xff1a; 在开发的过程中&#xff0c;如果有多个重复的值&#xff0c;我们希望可以进行合并显示&#xff0c;这样就不会显得重复太多&#xff0c;el-table有自带的方法&#xff1a; Element - …

安装编译器

安装MinGW&#xff0c;下载地址&#xff1a; MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 下载x86_64-win32-seh&#xff0c;下载完解压到相应的路径下。

Leetcode-每日一题【剑指 Offer 32 - I. 从上到下打印二叉树】

题目 从上到下打印出二叉树的每个节点&#xff0c;同一层的节点按照从左到右的顺序打印。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回&#xff1a; [3,9,20,15,7] 提示&#xff1a; 节点总数 < 1000 解题思路 1.题目要求我们从…

创建SpringBoot项目报错 - Process finished with exit code 1

错误信息 [ERROR] The build could not read 1 project -> [Help 1] [ERROR] [ERROR] The project com.example:ruoyi-excel-demo:0.0.1-SNAPSHOT (D:\Java\work\ruoyiExcelDemo\pom.xml) has 1 error [ERROR] Non-resolvable parent POM for com.example:ruoyi-e…

爬虫逆向实战(十六)--某建筑市场平台

一、数据接口分析 主页地址&#xff1a;某建筑市场平台 1、抓包 通过抓包可以发现数据接口是list 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 通过查看“响应”模块可以发现&#xff0c;返回的响应是…

【共同缔造 情暖襄阳】 暑期关爱未成年人志愿服务活动合集(三)

结合2023年襄阳市民政局“共同缔造 情暖襄阳”社会工作服务项目&#xff0c;在襄阳市民政局、襄州区民政局支持下&#xff0c;襄州社工协会联合肖湾街道育红社区开展暑期“希望家园”志愿服务活动&#xff0c;关爱未成年人。 8月4日&#xff0c;为培育孩子们广泛的兴趣爱好和动…

【JVM】垃圾回收算法

目录 一、判断对象已“死” 1.1、引用计数算法 1.2、可达性分析算法 1.3、引用的概念 二、垃圾收集算法理论 2.1、分代收集理论 三、垃圾收集算法 3.1、标记--清除算法 3.2、标记--复制算法 3.3、标记--整理算法 一、判断对象已“死” 在堆里面存放着Java世界中几乎所…

AGI 在网易云信的技术提效和业务创新

We believe our research will eventually lead to artificial general intelligence, a system that can solve human-level problems. Building safe and beneficial AGI is our mission. ---- OpenAI 通用人工智能 AGI 作为 AI 的终极形态&#xff0c;是 AI 行业内追求的演…

【制作npm包2】了解 package.json 相关配置

制作npm包目录 本文是系列文章&#xff0c; 作者一个橙子pro&#xff0c;本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

TECHnalysis Research:关于生成式AI的几个意外发现

TECHnalysis Research是一家美国的独立市场调查公司&#xff0c;该调查公司于2023年5月份对于全美10个行业的1000家企业IT决策负责人进行了调研&#xff0c;调研围绕生成式AI及其对于企业业务的影响。就在全球持续升温的生成式AI热度中&#xff0c;TECHnalysis Research的调研结…