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

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,则直接拒绝,因为已经领取了
  4. 去重,比如爬虫爬取url,下一个网页可能存在上一个网页的链接,防止重复爬取url造成死循环,可以使用布隆过滤器,把爬过的网页进行hash后存到布隆过滤器,每次爬到url的时候就去布隆过滤器看下是否存在, 如果存在,则忽略掉,直接爬下一个即可

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个整数是否存在// 不指定默认64BitSet bitSet = new BitSet(128);bitSet.set(0);bitSet.set(66);// 输出bitSet大小,应该是128,因为66大于64,所以需要第二个Long位,每个Long位是64,2个就是128System.out.println("bitSet大小: " + bitSet.size());// 这个是bit位的长度,是最大的那个数字+1,即67System.out.println("bitSet长度: " + bitSet.length());// 查询出有多少个为1的位,显然我们只存了0和66,只有俩,所以结果就是2System.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”)

布隆过滤器(BloomFilter)和位图(bitMap)的区别

  1. BitMap的每个位只会存储1个元素的标识,而bloomFilter可以标识多个元素,因为1个元素会hash出多个值,并存到多个位
  2. BitMap只能存int类型,而bloomFilter可以存储多种类型,原理是通过hash取模的方式,所以String存在hash碰撞
  3. BitMap的每个元素会消耗1个bit来存储,而BloomFilter通常来说会小于1bit,因为每个位可能会存储多个元素,那么平摊下来,每个元素就小于1bit,当然如果元素很少,那1个元素会占用3个bit,那就更多了。

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

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

相关文章

马哈鱼数据血缘工具背后的项目: gsp_demo_java 项目简单介绍与使用

0.背景 马哈鱼数据血缘工具(https://www.sqlflow.cn/)是SQLflow工具的中文译名,实际就是sqlflow. 对于SQL flow来说,底层调用的是General SQL Parser(GSP https://sqlparser.com) 的库. 这个gsp有开源的java demo项目:https://github.com/sqlparser/gsp_demo_java 1.快速使用…

第6章:支持向量机

间隔与支持向量 w为法向量,决定的是超平面的方向。b是偏移项,决定了超平面与原点之间的距离。 为什么最大化间隔,得到的就是最优平面呢? 当超平面没有正确划分正负样本时,几何间隔为负数。几何间隔,各个…

网络编程基础(1)

目录 网络编程解决是跨主机的进程间通讯 1、网络 2、互联网 3、ip地址 (1)ipv4: (2)ipV6:1 (3)IP地址的组成: (4)Linux查看IP地址:ifconfig 4、mac地址 5、ping Ip地址 6…

VisualVM(All-in-One Java Troubleshooting Tool)多合-故障处理工具

VisualVM:多合-故障处理工具 VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的 运行监视 和 故障处理 程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。Oracle曾在VisualVM的软件说明中写…

数据结构--最短路径 Floyd算法

数据结构–最短路径 Floyd算法 F l o y d 算法:求出每⼀对顶点之间的最短路径 \color{red}Floyd算法:求出每⼀对顶点之间的最短路径 Floyd算法:求出每⼀对顶点之间的最短路径 使⽤动态规划思想,将问题的求解分为多个阶段 对于n个顶…

QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库

QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库 0、背景1、基本环境2、搭建交叉编译环境3、在交叉编译服务器上交叉编译安装unixODBC3.1 下载unixODBC3.2 交叉编译unixODBC3.2.1 基本编译说明3.2.2 交叉编译说明3.2.3 ./configure -build,-host,-target…

不知道开黑语音哪个软件好?

黑盒语音官方网站:https://chat.top 免费支持AI降噪免费支持高品质立体声免费支持码率128Kbps,192Kbps免费支持上传100M文件免费支持动态房间头像和横幅支持更多自定义动态表情即将支持更多免费功能

IP 地址监控工具

地址监控实用程序是一套 IP 工具,包括 IP 地址监控工具、流氓检测工具和 MAC 地址解析器,用于日常监控和管理 DNS 名称、IP和 MAC 地址。地址监控工具用于 IP监控,用于管理 DNS 名称、网络的 IP 和 MAC 地址,并跟踪 IP 地址。 IP…

JavaScript中的this关键字的作用,以及它如何确定其值

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ this关键字的作用⭐ this的值取决于执行上下文⭐ 示例⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这…

MySQL数据库第十四课--------sql优化---------层层递进

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

极光笔记 | 如何为您的业务开发和训练一个AI-BOT

生成式AI(Generative AI)是当今科技领域的前沿技术之一。随着数据量的不断增加和计算能力的不断提升,AI技术在企业和个人生活中的应用越来越广泛。AI-BOT(以下简称BOT)是生成式AI技术的其中一种重要的应用形式&#xf…

最小二乘拟合圆柱

目录 一、算法原理二、代码实现 本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 由圆柱面的几何特性可得,圆柱面上的点到其轴线的距离恒等于半径 r 0 r_0 r0​,…

Java自学到什么程度就可以去找工作了?

引言 Java作为一门广泛应用于软件开发领域的编程语言,对于初学者来说,了解到什么程度才能开始寻找实习和入职机会是一个常见的问题。 本文将从实习和入职这两个方面,分点详细介绍Java学习到什么程度才能够开始进入职场。并在文章末尾给大家安…

基于springboot+vue的博物馆藏品平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

剑指 Offer 48. 最长不含重复字符的子字符串(C++实现)

剑指 Offer 48. 最长不含重复字符的子字符串https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ dp 注意:缩小 不含重复字符子串 时的写法 dp_1 min(i - charToIndex[s[i]], dp_0 1); int lengthOfLongestSubstring(string s…

python中使用xml快速创建Caption和URL书签管理器应用程序

导语: 本文介绍如何使用wxPython库创建一个Caption和URL管理器应用程序。该应用程序具有图形用户界面,允许用户输入Caption和URL,并将其保存到XML文件中。此外,还提供了浏览文件夹并选择HTML文件的功能,并可以运行另一…

深入解析淘宝API,实现高效商务应用

淘宝API的基本调用 1. API文档与SDK 淘宝API官方提供了详细的API文档,包含了API的使用说明、参数列表、示例代码等内容。开发者可以通过文档了解每个API接口的具体功能和使用方法。此外,淘宝API还提供了多种编程语言的SDK,方便开发者进行快速…

jupyter notebook出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

c#扩展方法的使用

扩展方法可以向现有类型“添加”方法,无需创建新的派生类型、重新编译或以其他方式修改原始类型,用起来很方便,下面是我写的例子,为string这个常用的类型添加一个showmes方法,以下是扩展方法的代码: public…

python爬虫9:实战2

python爬虫9:实战2 前言 ​ python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论,并不会对网站产生不好…