手写一个简易的布隆过滤器

1.什么是布隆过滤器

布隆过滤器(Bloom Filter)是1970年由布隆(人名)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
人话理解就是,布隆过滤器是一个容器,我们可以往这个容器里添加元素,并且可以查询某个元素是否在容器中存在,欸有人就经验的可以知道,这个工作Set也可以做,为什么要用布隆过滤器呢,

  • 布隆过滤器的优点:
    时间复杂度低,增加和查询元素的时间复杂为O(N),(N为哈希函数的个数,通常情况比较小)
    保密性强,布隆过滤器不存储元素本身
    占用空间小,如果允许存在一定的误判,布隆过滤器是非常节省空间的(相比其他数据结构如Set集合)
  • 布隆过滤器的缺点:
    有点一定的误判率,但是可以通过调整参数来降低
    无法获取元素本身
    很难删除元素(可以试试自己实现一个可以删除元素的某隆过滤器)

2. 布隆过滤器的使用使用场景

布隆过滤器可以告诉我们 “某样东西一定不存在或者可能存在”,也就是说布隆过滤器说这个数不存在则一定不存,布隆过滤器说这个数存在可能不存在(误判,后续会讲),**利用这个判断是否存在的特点可以做很多有趣的事情。

  1. 解决Redis缓存穿透问题(面试重点)
  2. 邮件过滤,使用布隆过滤器来做邮件黑名单过滤
  3. 对爬虫网址进行过滤,爬过的不再爬
  4. 解决新闻推荐过的不再推荐(类似抖音刷过的往下滑动不再刷到)
  5. HBase\RocksDB\LevelDB等数据库内置布隆过滤器,用于判断数据是否存在,可以减少数据库的IO请求

实现原理

布隆过滤器它实际上是一个很长的二进制向量和一系列随机映射函数。以Redis中的布隆过滤器实现为例,Redis中的布隆过滤器底层是一个大型位数组(二进制数组)+多个无偏hash函数。
我下面的实现是采用了二维数组的方式来实现的,一个hash函数对应每一个数组,这样的误判率会非常小,当然每个人都有自己的实现方式,学习思想即可

代码实现

1.定义接口

public interface AccessInterface<T extends Object> {void add(T t);boolean query(T t);boolean set(T t);
}

2.hash值方法实现

public class HashCode<T extends Object> {/*** @param index* @param length* @param t* @return* 注:适用于hashpool较小的时候,,太大了不行。计算hash值的时候会溢出,当然这个问题换个对象来计算就行了,这里图省事就简单点, Java有内置的大数据对象。*/public int GetHashCode(int index,int length,T t){int hashcode=t.hashCode();Long hashcode1=Math.round(Math.floor((hashcode+index+index*index)%length));return hashcode1.intValue();}}
  1. 过滤器实现
/*** 过滤器实现*/
public class BlloomEnity<T extends Object> implements AccessInterface<T> {private boolean[][] blloompool;private int length;HashCode<T> Code;public BlloomEnity() {this.length=100;this.blloompool=new boolean[100][100];this.Code=new HashCode<T>();}public BlloomEnity( int length) {this.blloompool = new boolean[length][length];this.length = length;this.Code=new HashCode<T>();}@Overridepublic void add(T o) {for(int i=0;i<this.length;i++){int k=Code.GetHashCode(i+1,this.length,o);this.blloompool[i][k]=true;}}@Overridepublic boolean query(T o) {for(int i=0;i<this.length;i++){int k=Code.GetHashCode(i+1,this.length,o);if(!this.blloompool[i][k]){return false;}}return true;}@Overridepublic boolean set(T o) {if(query(o)){return false;}else{add(o);}return true;}
}
  1. 测试
    测试通过
    完事儿,一切对象都可存,

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

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

相关文章

浏览器同源策略

浏览器同源策略 同源策略&#xff1a;是一个重要的浏览器的安全策略&#xff0c;用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互 它能帮助阻隔恶意文档&#xff0c;减少可能被攻击的媒介 例如&#xff1a;被钓鱼网站收集信息&#xff0c;使用ajax发起…

Containerd的两种安装方式

1. 轻量级容器管理工具 Containerd 2. Containerd的两种安装方式 3. Containerd容器镜像管理 4. Containerd数据持久化和网络管理 操作系统环境为centos7u6 1. YUM方式安装 1.1 获取YUM源 获取阿里云YUM源 # wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun…

滇医通微信小程序分析笔记

注意 本文章仅供学习交流使用&#xff0c;如果你是铁粉你就会知道博主之前发布过一篇相关的文章&#xff0c;但是由于代码涉及到法律相关所以就隐藏了&#xff0c;两年的时间过去了&#xff0c;因为女朋友已经早早安排上了&#xff0c;所以就搁置了&#xff0c;本次不做代码分…

[国产MCU]-BL602开发实例-开发环境搭建

开发环境搭建 文章目录 开发环境搭建1、BL602介绍2、软件准备3、源码编译3.1 编译内置工程3.2 自定义工程、自定义组件添加与编译4、固件下载BL602 是一款Wi-Fi + BLE组合的芯片组,用于低功耗和高性能应用开发。无线子系统包含2.4G无线电,Wi-Fi 802.11b/g/n和BLE 5.0 基带/MA…

了解HTTP代理日志:解读请求流量和响应信息

嗨&#xff0c;爬虫程序员们&#xff01;你们是否在了解爬虫发送的请求流量和接收的响应信息上有过困扰&#xff1f;今天&#xff0c;我们一起来了解一下。 首先&#xff0c;我们需要理解HTTP代理日志的基本结构和内容。HTTP代理日志是对爬虫发送的请求和接收的响应进行记录的文…

MacOS上用docker运行mongo及mongo-express

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 前提 要求…

AOP实现日志的打印

AOP面向切面编程&#xff0c;是一种抽象化的面向对象编程&#xff0c;也可以理解为对面向对象编程的补充 下面来举一个打印日志的例子 问题描述&#xff1a;写一个计算器的实现类&#xff0c;实现加减乘除功能&#xff0c;并在进行计算前日志输出方法&#xff0c;计算后输出结…

jmeter工具测试和压测websocket协议【杭州多测师_王sir】

一、安装JDK配置好环境变量&#xff0c;安装好jmeter 二、下载WebSocketSampler发送请求用的&#xff0c;地址&#xff1a;https://bitbucket.org/pjtr/jmeter-websocket-samplers/downloads/?spma2c4g.11186623.2.15.363f211bH03KeI 下载解压后的jar包放到D:\JMeter\apache-j…

从小白到数据库达人!Mysql优化让你的社招面试无往不利!

大家好&#xff0c;我是小米&#xff0c;在这个美好的时刻又迎来了我们的技术小窝。今天&#xff0c;我们要聊一聊一个在数据库领域中无比重要的话题 —— Mysql 优化&#xff01;是不是感觉很兴奋呢&#xff1f;废话不多说&#xff0c;让我们直接进入今天的主题。 背景知识 …

STM32——LED内容补充(寄存器点灯及反转的原理)

文章目录 点灯流程开时钟配置IO关灯操作灯反转宏定义最后给自己说 本篇文章使用的是STM32F103xC系列的芯片&#xff0c;四个led灯在PE2,PE3,PE4,PE5上连接 点灯流程 1.开时钟 2.配置IO口 &#xff08;1&#xff09;清零指定寄存器位 &#xff08;2&#xff09;设置模式为推挽输…

一键开启ChatGPT“危险发言”

‍ ‍ 大数据文摘授权转载自学术头条 作者&#xff1a;Hazel Yan 编辑&#xff1a;佩奇 随着大模型技术的普及&#xff0c;AI 聊天机器人已成为社交娱乐、客户服务和教育辅助的常见工具之一。 然而&#xff0c;不安全的 AI 聊天机器人可能会被部分人用于传播虚假信息、操纵舆…

【jvm】jvm整体结构(hotspot)

目录 一、说明二、java代码的执行流程三、jvm的架构模型3.1 基于栈式架构的特点3.2 基于寄存器架构的特点 一、说明 1.hotspot vm是目前市场上高性能虚拟机的代表作之一 2.hotspot采用解释器与即时编译器并存的架构 3.java虚拟机是用来解释运行字节码文件的&#xff0c;入口是字…

分布式系统:ACID与CAP

ACID: 在计算机科学中&#xff0c;ACID是数据库事务的一组特性&#xff0c;旨在保证数据的有效性&#xff0c;即使在出现错误、断电和其他意外情况下也能保持数据的一致性。在数据库的上下文中&#xff0c;满足ACID属性的一系列数据库操作&#xff08;可以被视为对数据的单一逻…

Vue实战技巧:从零开始封装全局防抖和节流函数

前言 你是否曾经遇到过用户频繁点击按钮或滚动页面导致反应迟钝的问题&#xff1f;这是因为事件被连续触发&#xff0c;导致性能下降。在本文中&#xff0c;我将为大家介绍 vue 中的防抖和节流策略&#xff0c;并展示如何封装全局的防抖节流函数&#xff0c;以避免频繁触发事件…

Tensorflow2-初识

TensorFlow2是一个深度学习框架&#xff0c;可以理解为一个工具&#xff0c;有谷歌的全力支持&#xff0c;具有易用、灵活、可扩展、性能优越、良好的社区资源等优点。 1、环境的搭建 1.1 Anaconda3的安装 https://www.anaconda.com/ Python全家桶&#xff0c;包括Python环境和…

Scratch 之 大地图引擎怎么做?

引子 简单的介绍一下&#xff0c;一些游戏引擎是有一个隐形小地图存在的&#xff0c;这个隐形小地图通常用来侦测碰碰撞和移动。那么&#xff0c;一个大地图引擎的背景肯定是很大的(一般来说大小都超过200)&#xff0c;如果我们要做出一个枪战作品&#xff0c;那就迟早会发现一…

Layui实现OA会议系统之会议管理模块总合

目录 一、项目背景 二、项目概述 1. 概述 2. 环境搭建 3. 工具类引用 4. 功能设计 4.1 会议发布 4.2 我的会议 4.3 会议审批 4.4 会议通知 4.5 待开会议 4.6 历史会议 4.7 所有会议 5. 性能优点 5.1 兼容性好 5.2 可维护性和可扩展性 5.3 轻量灵活 5.4 模块化设计…

图 ML 中的去噪扩散生成模型

Denoising Diffusion Generative Models in Graph ML | by Michael Galkin | Towards Data Science (medium.com) 一、说明 AI DDPM 代表【"Adaptive Importance Density Power Mixture Model" 】即“自适应重要性密度幂混合模型”&#xff0c;是一种用于密度估计的机…

8.物联网操作系统之事件标志组

。事件标志组定义 FreeRTOS事件标志组介绍 FreeRTOS事件标志组工作原理 一。事件标志组定义 信号量信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步&#xff0c;此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与…

LeetCode--HOT100题(23)

目录 题目描述&#xff1a;206. 反转链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;206. 反转链表&#xff08;简单&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 LeetCode做题链接&…