java简单实现布谷鸟过滤器的
布谷鸟过滤器,一种增强版的布隆过滤器,不同于布隆过滤器的是,存放一段hash的地方会多个位置,用于增加空间率用率,布谷鸟过滤器会有两个hash,异或算法,两个hash能找到相互的位置,用于其中一个被布谷鸟的蛋T走时的容错。
/*** 布谷鸟过滤器* @Description: CuckooFilter* @Author: GeorgeYang* @Date: 2022-06-07* @Version:v1.0*/
public class CuckooFilter {/*** 预期处理的数据量大小*/private int dataCount;/*** 位数组的数量大小*/private int bitCount;private int bitSpace;/*** 鸟巢位置2* 位数组。数组中的元素只能是 0 或者 1*/private BitSet nestPosition1;/*** 鸟巢位置2* 位数组。数组中的元素只能是 0 或者 1*/private BitSet nestPosition2;/*** 存放包含 hash 函数的类的数组*/private SliceHash[] func;/*** 静态内部类。hash 函数* 块hash*/public static class SliceHash {private int bitIndex;//bitIndexprivate int fp;private int intSliceSpace;//hash成整数,每段长多少public SliceHash(int bitSpace, int bitIndex) {this.bitIndex = bitIndex;this.fp = bitSpace * bitIndex;this.intSliceSpace = Integer.MAX_VALUE / bitSpace;}/*** 计算 hash 值*/public int hash1(Object value) {return Math.abs(bitIndex * intSliceSpace + (value.hashCode() << bitIndex) % intSliceSpace);}public int hash2(Object value) {int hash1 = this.hash1(value);int hash2 = hash1 ^ fp;return Math.abs(hash2);}}/**** @param dataCount 预计存放总数量* @param bitSpace 每个内容,可以被拆分分散在多少个位置里面选择存放,*/public CuckooFilter(int dataCount, int bitSpace) {this.dataCount = dataCount;this.bitSpace = bitSpace;//每个字符分配32个位this.bitCount = dataCount * bitSpace;func = new SliceHash[bitSpace];//16个for (int i = 0; i < bitSpace; i++) {func[i] = new SliceHash(bitSpace, i);}this.nestPosition1 = new BitSet(bitCount);this.nestPosition2 = new BitSet(bitCount);}public boolean add(Object value) {if (contains(value))return false;for (SliceHash f : func) {int hash1 = f.hash1(value);nestPosition1.set(hash1, true);nestPosition2.set(hash1, false);//T走同巢隔壁位置的蛋int hash2 = f.hash2(value);nestPosition1.set(hash2, false);//T走同巢隔壁位置的蛋nestPosition2.set(hash2, true);}return true;}public boolean contains(Object value) {for (SliceHash f : func) {int hash1 = f.hash1(value);int hash2 = f.hash2(value);boolean inPosition1 = nestPosition1.get(hash1);boolean inPosition2 = nestPosition2.get(hash2);boolean existInOne = inPosition1 || inPosition2;if (!existInOne)//两个巢位都被T走了return false;}return true;}public static void main(String[] args) throws Exception {int dataCount = 2 << 24;
// int dataCount = 9000000;System.out.println(dataCount);CuckooFilter filter = new CuckooFilter(dataCount, 5);int wrongCount = 0;int addCount = 9999999;//1亿数据for (int i = 0; i < addCount; i++) {String value = "" + i;boolean exist = filter.contains(value);if (exist) {wrongCount++;}boolean addSuccess = filter.add(value);exist = filter.contains(value);if (!exist)throw new InterruptedException("添加后被认为不存在:" + value);}System.out.println("误判的数量:" + wrongCount);System.out.println("误判率:" + (wrongCount * 100d / addCount) + "%");int lostCount = 0;int existCount = 0;for (int i = 0; i < addCount; i++) {String value = "" + i;boolean exist = filter.contains(value);if (exist) {existCount++;} else {lostCount ++;}}System.out.println("存留的数量:" + (existCount - wrongCount));System.out.println("存留率:" + ((existCount - wrongCount) * 100d / addCount) + "%");System.out.println("被T除的数量:" + lostCount);System.out.println("丢失率:" + (lostCount * 100d / addCount) + "%");}}
测试添加1亿数据,运行结果:
误判的数量:876
误判率:0.008760000876000087%
存留的数量:9932122
存留率:99.32122993212299%
被T除的数量:67001
丢失率:0.6700100670010067%
还没有做扩容等操作,这里只是简单的实现。
参考:
https://zhuanlan.zhihu.com/p/462813998
https://blog.csdn.net/aaa_bbb_ccc_123_456/article/details/106055033
java简单实现布谷鸟过滤器的相关推荐
- 布隆过滤器和布谷鸟过滤器详解
今天和大家分享下布隆过滤器和布谷鸟过滤器 一.布隆过滤器 1.简单介绍 布隆过滤器是用于检索一个元素是否在一个集合中的算法,是一种用空间换时间的查询算法. 2.实现原理 布隆过滤器的存储结构是一个bi ...
- java项目中布隆过滤器和布谷鸟过滤器
布隆过滤器 布隆过滤器是一个叫"布隆"的人提出的,它本身是一个很长的二进制向量,既然是二进制的向量,那么显而易见的,存放的不是0,就是1. 现在我们新建一个长度为16的布隆过滤器, ...
- 过滤请求绝技,布隆过滤器与布谷鸟过滤器
欢迎关注方志朋的博客,回复"666"获面试宝典 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们 ...
- Redis 之布隆过滤器与布谷鸟过滤器
欢迎关注方志朋的博客,回复"666"获面试宝典 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们 ...
- 【不体系】布谷鸟过滤器
1.概述 转载:https://mp.weixin.qq.com/s/HVb0g6w37gvn307DrnVtTg 为解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世. 论文<Cuckoo ...
- 为什么我加了过滤器然后就登不进去了_布隆过滤器过时了,未来属于布谷鸟过滤器?...
为了解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世.论文<Cuckoo Filter:Better Than Bloom>作者将布谷鸟过滤器和布隆过滤器进行了深入的对比.相比布谷鸟 ...
- Redis中的布隆过滤器与布谷鸟过滤器,你了解多少?
点击关注公众号,实用技术文章及时了解 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们业务后端涉及数据库,当请求消息 ...
- Redis布隆过滤器与布谷鸟过滤器
- 目录 - 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们业务后端涉及数据库,当请求消息查询某些信 ...
- 布隆过滤器(Bloom Filter)、布谷鸟过滤器(Cuckoo Filter)、商过滤器(quotient filter)(持续更新~~~~)
过滤器 位图 布隆过滤器(Bloom Filter) 布谷鸟过滤器(Cuckoo Filter) 商过滤器(quotient filter) 文章参考链接 位图 在讨论布隆过滤器之前,先看一下位图是什 ...
最新文章
- 数据结构显示树的所有结点_您需要了解的有关树数据结构的所有信息
- 时间复杂度O(n),空间复杂度O(1)的排序
- C语言 —— 获取字符串中两个字符之间的的数据
- 乐视云没创意,还拿“免费”说事儿
- docker环境安装redis
- 第四范式发布Sage AIOS 2.0及智能应用市场Sage App Store
- ASP.NET Core必备笔试题(含答案)
- Ubuntu 10.10, 11.04, 11.10这三个版本无法从优盘启动
- 通过串口来控制网管型交换机的操作步骤详解
- asp.net treeView绑定
- Java中List排序的3种方法!
- python重复输入字符串a三次_8道Python基础面试练习题
- PHP Primary script unknown 终极解决方法
- 查看Linux服务器raid信息笔记整理!
- fopen php 读取_PHP fopen读取url内容
- 采集的时候,列表的编码是gb2312,内容页的编码却是UTF-8,这种网站怎么采集?
- java项目 分模块管理_java 工程项目模块划分及各模块功能梳理
- 下周把交接文档做完就交接实习结束离职了
- 基于javaweb+jsp的员工薪资工资管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Layui Ajax)
- 【破解三网】iphone5 国行 A1429
热门文章
- java有阴历年算法吗_中国农历算法java实现
- 计算机程序员笔试题,历年计算机软考程序员笔试真题及答案
- 发送给客户的文件,怕泄漏怎么办?
- 【算法】独立任务最优调度问题
- CSAPP LAB4 键盘驱动程序的分析与修改(谢罪)
- adb 禁止app联网_ADB大法好!无需ROOT也可以使用APP Ops来管理手机应用权限
- JAVA六大设计原则 和 23种设计模式
- c++实现图书管理系统v2.0
- 什么是Web?Web Service、Web API傻傻分不清楚?
- 打条码软件怎样测试到纸张大小,条码标签纸规格有哪些?如何在打印机上设置打印尺寸?...