这个过滤器本身是一篇论文中提出的过滤器的简化版本,去掉了计数功能,我觉得简化版本应用的可能也很广,专门写一篇简化版本的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的更多相关文章

  1. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  2. RX系列三 | RxJava | create | from | interval | just | range | filter

    RX系列三 | RxJava | create | from | interval | just | range | filter 我们在第一篇里有说过一些基本的关系,现在我们需要用到一些依赖,这里记 ...

  3. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  4. 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家

    系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...

  5. Web 开发人员和设计师必读文章推荐【系列三十】

    <Web 前端开发精华文章推荐>2014年第9期(总第30期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  6. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  7. MySQL并发复制系列三:MySQL和MariaDB实现对比

    http://blog.itpub.net/28218939/viewspace-1975856/ 并发复制(Parallel Replication) 系列三:MySQL 5.7 和MariaDB ...

  8. WCF编程系列(三)地址与绑定

    WCF编程系列(三)地址与绑定   地址     地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定.URI由通讯协议和位置路径两部分组成,如示例一中的: http://loc ...

  9. SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

    原文:SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server ...

  10. VSTO之旅系列(三):自定义Excel UI

    原文:VSTO之旅系列(三):自定义Excel UI 本专题概要 引言 自定义任务窗体(Task Pane) 自定义选项卡,即Ribbon 自定义上下文菜单 小结 引言 在上一个专题中为大家介绍如何创 ...

随机推荐

  1. Google Now 'not available in your country'

    Google Now 'not available in your country' Don't know how to cope with this problem.

  2. scrapy爬虫系列之一--scrapy的基本用法

    功能点:scrapy基本使用 爬取网站:传智播客老师 完整代码:https://files.cnblogs.com/files/bookwed/first.zip 主要代码: ff.py # -*- ...

  3. Django - 模型层 - 下

    一.多表 sql 单表 多表 多对一 多对多 一对一 =============================================== 一对多:Book id title price p ...

  4. 【我的Android进阶之旅】解决AndroidStudio编译时报错:Timeout waiting to lock artifact cache .

    1. 错误描述 今天在Android Studio中,使用gradle命令的时候,出现了如下所示的错误: D:\GitLab Source\XTCLint>gradlew clean uploa ...

  5. cocos2d首印象

    一. 创建工程 从 2.1.4 版本开始,官方就不再为 VS 提供模板了,逐步在各平台采用统一的 Python 脚本创建跨平台工程. 要创建工程,我们需要先从命令行进入 tools/project-c ...

  6. Flask系列(一)flask入门

    一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  7. 基于 Spark 的文本情感分析

    转载自:https://www.ibm.com/developerworks/cn/cognitive/library/cc-1606-spark-seniment-analysis/index.ht ...

  8. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

    一.什么是跨域访问 举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请 ...

  9. R语言编程

    R中的帮助文档非常有用,其中有四种类型的帮助 help(functionname) 对已经加载包所含的函数显示其帮助文档,用?号也是一样的. help.search('keyword') 对已经安装的 ...

  10. http之响应报文response

    一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息. HTTP响应也由四个部分组成,分别是:状态行.消息报头.空行和响应正文. http响应消息格式.jpg 例子 HTTP/ ...