过滤器系列(三)—— RSQF
这个过滤器本身是一篇论文中提出的过滤器的简化版本,去掉了计数功能,我觉得简化版本应用的可能也很广,专门写一篇简化版本的RSQF。RSQF全称是rank-and-select based filter,一会我们会专门来讲这个rank-and-select是什么。
原论文可以到这里下载:http://www3.cs.stonybrook.edu/~ppandey/files/SIGMOD17_Talk_CQF_long.pdf
过滤器分下面几部分来讲
Hash函数
这部分不属于原论文,这部分假设有一个比较好的Hash函数,可以将原数据hash成n位数据,设n = q + r,这个r实际上控制着过滤器的假阳率和空间大小的平衡。假阳率是\(2^{-r}\),当然如果r越大,空间消耗也越大
结构
结构部分如下图所示
我们分别来介绍这个结构中的各部分,其中occupieds这一行是1bit数组,元素只能表示1或0;runends也是1bit数组;remainders内每个元素占用r个bit,就是前一部分说的r。这个块总共有\(2^q\)列,q也是前文说的q。
我们设某一列的下标为\(i\),则当有元素hash后的前q位对应到这一列的时候,\(occupieds[i] = 1\);我们把这个元素放到对应位置上,那么如果有多个元素对应这个位置,我们要求,把具有相同前q位的元素放到相邻位置。那么什么时候代表结束呢?就是这些前q位相同的元素的最后一个元素对应位置\(runends[i] = 1\)。在图中,相同颜色的元素其前q位是相同的,也就是说如果不考虑重复,他们都应该存在相同位置上的。
算法
def MAY_CONTAIN(Q,x)
"""
查找算法,Q代表存储结构,x代表要查找的元素
"""
b = h0(x) #计算hash值,取其前q位
if Q.occupieds[b] = 0:
return 0
t = RANK(Q.occupieds,b)
k = SELECT(Q.runends,t)
v = h(x) #计算hash值取其后r位
while k >= b and Q.runends[k] = 0:
if Q.remainders[k] = v:
return 1
k -= 1
return false
RANK(Q,i)是找到在位置i之前,数组Q中有多少个1出现过
SELECT(Q,i)是找到数组Q中第i次出现1的位置
先通过找到在某个位置之前在occupieds上有多少个1,就代表有多少组相同前q位hash值的元素组,然后通过runends的第i个1,找到目前这个位置对应的组,这样就可以精准定位。
def find_first_unused_slot(Q,x):
"""
找到第一个空位置,以便于在插入元素时向后移动元素
"""
r = rank(Q.occupieds,x)
s = select(Q.runends)
while x < s:
x = s + 1
r = RANK(Q.occupieds,x)
s = SELECT(Q.runends,s)
return x
def insert(Q,x):
"""
插入一个元素
实质是先找到一个空位,然后把要插入位置之后的所有元素依次右移,直到把要插入位置空出来为止
"""
r = RANK(Q.occupieds,h0(x))
s = SELECT(Q.runends,r)
if h0(x) > s:
Q.remainders[h0(x)] = h1(x)
Q.runends[h0(x)] = 1
else:
s += 1
n = find_first_unused_slot(Q,s)
while n > s:
Q.remainders[n] = Q.remainers[n-1]
Q.runends[n] = Q.remainers[n-1]
n -= 1
Q.remainers[s] = h1(x)
if Q.occupieds[h0(x)] == 1:
Q.runends[s-1] = 0
Q.runends[s] = 1
Q.occupieds[h0(x)] = 1
return
原论文中其实还有一个在块内加速的一个索引方式,在这里没有讲到,想要详细了解的可以看原论文。如果想要看带计数功能版本的过滤器也请看原论文,github上也有公开代码。https://github.com/splatlab/cqf
过滤器系列(三)—— RSQF的更多相关文章
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- RX系列三 | RxJava | create | from | interval | just | range | filter
RX系列三 | RxJava | create | from | interval | just | range | filter 我们在第一篇里有说过一些基本的关系,现在我们需要用到一些依赖,这里记 ...
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
Redis总结(五)缓存雪崩和缓存穿透等问题 前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...
- 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- Web 开发人员和设计师必读文章推荐【系列三十】
<Web 前端开发精华文章推荐>2014年第9期(总第30期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- MySQL并发复制系列三:MySQL和MariaDB实现对比
http://blog.itpub.net/28218939/viewspace-1975856/ 并发复制(Parallel Replication) 系列三:MySQL 5.7 和MariaDB ...
- WCF编程系列(三)地址与绑定
WCF编程系列(三)地址与绑定 地址 地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定.URI由通讯协议和位置路径两部分组成,如示例一中的: http://loc ...
- SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型
原文:SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server ...
- VSTO之旅系列(三):自定义Excel UI
原文:VSTO之旅系列(三):自定义Excel UI 本专题概要 引言 自定义任务窗体(Task Pane) 自定义选项卡,即Ribbon 自定义上下文菜单 小结 引言 在上一个专题中为大家介绍如何创 ...
随机推荐
- handle exceptions, opening and closing database connections
https://www.tutorialspoint.com/spring/spring_jdbc_framework.htm Spring - JDBC Framework Overview Whi ...
- D. Babaei and Birthday Cake---cf629D(LIS线段树优化)
题目链接:http://codeforces.com/problemset/problem/629/D 题意就是现有n个蛋糕,蛋糕的形状是圆柱体,每个蛋糕的体积就是圆柱体的体积,每个蛋糕的编号是1-- ...
- Python开发【模块】:matplotlib 绘制折线图
matplotlib 1.安装matplotlib ① linux系统安装 # 安装matplotlib模块 $ sudo apt-get install python3-matplotlib # 如 ...
- Hadoop NameNode 高可用 (High Availability) 实现解析
转载自:http://reb12345reb.iteye.com/blog/2306818 在 Hadoop 的整个生态系统中,HDFS NameNode 处于核心地位,NameNode 的可用性直接 ...
- HDU1796How many integers can you find(容斥原理)
在计数时,必须注意无一重复,无一遗漏.为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计 ...
- king 选 太子
king 选 太子 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 啊,从前有一个国家.此国兵强马壮,但是国王却身体不好.于是就想挑一位太子出来: 但是问题来了,国王 ...
- SEO笔记:Anatomy of a URL
Dr. Peter J. Meyers 原文链接:https://moz.com/blog/seo-cheat-sheet-anatomy-of-a-url 原文主要通过对比讲解 SEO优化后的URL ...
- Bootstrap抽样(自展法)
Bootstrap又称自展法,是用小样本估计总体值的一种非参数方法,在进化和生态学研究中应用十分广泛.例如进化树分化节点的自展支持率等. Bootstrap的思想,是生成一系列bootstrap伪样本 ...
- java--jvm启动的参数
java启动参数共分为三类其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容:其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保 ...
- 20145314郑凯杰《网络对抗技术》可选实验 shellcode注入与Return-to-libc攻击实验
20145314郑凯杰<网络对抗技术>可选实验 shellcode注入与Return-to-libc攻击实验 1.0 实践内容 Return-to-libc攻击是一种特殊的缓冲区溢出攻击, ...