布隆过滤器是一种判定元素是否存在于集合中的方法。其基本原理是使用哈希方法将数据映射到一个很长的向量上。在维基百科上,它被称为“空间效率和查询时间都远远超过一般的算法”的方法。由于它只保存散列的数据,所以对于很长的数据有着良好的压缩特性,这个是个不争的事实(可以参见《布隆过滤器 (Bloom Filter) 详解》)。但是其查询效率究竟如何,我们还是要实际测试一下。(转载请指明出于breaksoftware的csdn博客)

我们选用unordered_multiset作为对比对象,是因为在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找》中,实验验证它的查询效率是最高的。

由于布隆过滤器存在以下特性:

  • 判定不存在的一定不存在
  • 判定存在的可能不存在

实验分为两部分:

  1. 查找集合中不存在的元素
  2. 查找集合中存在的元素

由于布隆过滤器存在一定的误算率,所以在1的场景下,存在判定元素存在的可能性(存在误算率)。

我们使用的是https://github.com/ArashPartow/bloom版本的实现,它可以指定误算率。

由于散列计算需要时间,所以数据的长度也将是一个比较因子。于是上述每个实验都有三个影响因素

  1. 误算率
  2. 集合大小
  3. 数据长度

查找集合中不存在的元素

不同数据长度

在集合大小(65536)和误算率(0.1)确定的情况下,我们比较不同数据长度下,unordered_multiset、bloomfilter的构建,和它们查找1024个不存在的元素的时间消耗。

构建时间

可以见得,查找(search)时间比构建(build)时间要少很多。

当数据长度小于500时,bloomfilter比unordered_multiset构建时间要短。但是随着数据长度的增长,前者将花费更多的时间。也就是说unordered_multiset和bloomfilter的构建时间都符合线性增长规律,但是unordered_multiset初始耗时比bloomfilter要长,但是其增长系数比后者小。

查找时间

再看下查找(search)时间

在数据长度低于80时,bloomfilter比unordered_multiset要快。但是随着数据长度的增加,前者越来越慢。当数据长度达到30000时,存在2倍多的差距。

随着数据长度增加,bloomfilter的查找时间比unordered_multiset要长。

上述趋势规律在数据个数比较小时也适合,只是交叉点有所变化

不同集合大小

在数据长度(256)和误算率(0.1)确定的情况下,我们比较不同集合大小时,unordered_multiset、bloomfilter的构建,和它们查找1024个不存在的元素的时间消耗。

构建耗时

在相同数据长度的情况下,bloomfilter比unordered_multiset构建速度要快些,而且随着集合个数增长,其优势更加明显。

查找时间

当集合个数少于1,000,000个时,bloomfilter的查找还是比unordered_multiset慢,但是unordered_multiset随着集合大小增长会越来越慢。一旦超过阀值,unordered_multiset就永远比bloomfilter要慢了。而bloomfilter的查找速度一直比较稳定。

不同误算率

在数据长度(256)和集合个数(1048576)确定的情况下,我们比较不同误算率下,unordered_multiset、bloomfilter的构建,和它们查找1024个不存在的元素的时间消耗。

构建时间

因为unordered_multiset和误算率没有关系,而且数据长度和集合大小固定,所以它几乎是条直线。但是我们看到随着误算率的降低,bloomfilter的构建速度也在变慢。

查找时间

由于unordered_multiset和误算率无关,所以其查找时间也几乎是条直线。但是随着误算率降低,bloomfilter的查找时间越来越高。

查找集合中存在的元素

经过实验,其结果和“查找集合中不存在的元素”规律一致,这儿就不把图再罗列了。

总结:

  1. 随着集合个数增长,unordered_multiset的查找速度越来越慢。而bloomfilter比较稳定。个数较少时bloomfilter比unordered_multiset慢,但是超过一定阀值,bloomfilter将比unordered_multiset快。
  2. 随着数据长度增长,bloomfilter的查找速度越来越慢。而且速度比unordered_multiset慢较多。
  3. 随着误算率降低,bloomfilter的查找速度越来越慢。
  4. 除了内存因素外,检测bloomfilter是否是适合应用场景,需要基于上面三个因素做实验之后才能判断。

测试代码和生成图的代码见https://github.com/f304646673/test_bloomfilter

C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率相关推荐

  1. mysql布隆过滤器源码_布隆过滤器(Bloom Filter)的原理和实现

    什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...

  2. js 数组 实现 完全树_Flink实例(六十八):布隆过滤器(Bloom Filter)的原理和实现 - 秋华...

    什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...

  3. 布隆过滤器速度_布隆过滤器(Bloom Filter)详解

    布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元 ...

  4. 布隆过滤器+布隆过滤器(Bloom Filter)详解

    布隆过滤器+布隆过滤器(Bloom Filter)详解 程序 = 数据结构 + 算法 -- 图灵奖得主,计算机科学家N.Wirth(沃斯) A Bloom filter is a space effi ...

  5. Redis缓存穿透“新杀招“:布隆过滤器Bloom Filter

    场景分析 这篇文章来讲述缓存穿透的补充解决方案. 为什么要用补充来形容呢? 在之前的文章中,我们提到缓存穿透的解决方案时,我是这么说的: 关于缓存穿透,我们可以在用户访问数据库后将null值存入Red ...

  6. 布隆过滤器(Bloom Filter)详解——基于多hash的概率查找思想

    转自:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html   布隆过滤器[1](Bloom Filter)是由布隆(Burton ...

  7. 布隆过滤器(Bloom Filter)原理及优缺点剖析

    直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中. 和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储 ...

  8. 布隆过滤器Bloom Filter简介

    背景: 如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率: 采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL.红黑树)存储,查 ...

  9. 布隆过滤器(Bloom Filter)的原理和实现

    布隆过滤器使用场景 之前在<数学之美>里面看到过布隆过滤器的介绍.那么什么场景下面需要使用布隆过滤器呢? 看下下面几个问题 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个 ...

最新文章

  1. iOS 一行命令发布 Pod 框架
  2. 04-VTK可视化管线(1)
  3. 《HFSS电磁仿真设计从入门到精通》一第2章 入门实例——T形波导的内场分析和优化设计...
  4. Galgame研发日志:独立游戏制作前应当进行的第一步
  5. Java堆空间,本机堆和内存问题
  6. Recovery 流程简介
  7. 米斯特白帽培训讲义(v2)漏洞篇 文件上传
  8. 修改文章更新缓存php,php – 使用liipImagineBundle更新/删除记录时删除/更新缓存的图像...
  9. c#仿照qq登录界面编辑框内容操作
  10. 【Data guard】Switchover切换
  11. 简易天气java论文_【Java小项目】简单的天气预报
  12. .h5是什么文件_PPT转H5丨再也不用担心忘带U盘怎么办了
  13. 基于安卓手机的WAPI证书安装使用详解
  14. h5调用摄像头 android,H5 使用移动端摄像头
  15. 台达PLC编程软件PMSoft和WPLSoft爆出11个0Day 没有CVE没有补丁
  16. 名帖301 刘墉 行书《自作诗卷》
  17. 2015 Syrian Private Universities Collegiate Programming Contest 题解
  18. 2018年广东工业大学文远知行杯新生程序设计竞赛 1006 那天的延长线在今天β...
  19. 并发抢购 java_【转】京东抢购服务高并发实践
  20. swustOJ 1378 Best Grass

热门文章

  1. Deep Learning 目标检测
  2. opencv分别使用指针和LUT函数对BGR图像像素进行反转处理
  3. 【图像分类案例】(1) ResNeXt 交通标志四分类,附Tensorflow完整代码
  4. Angular1.x的自定义指令directive参数配置详细说明
  5. windows cmd 查看占用端口号PID并且结束进程
  6. UE虚幻引擎:建筑可视化学习教程 Unreal Engine : Architectural Visualization
  7. 制作欧比旺·克诺比逼真的CG角色学习教程
  8. linux进程间通信:system V 信号量和共享内存实现进程间同步
  9. # NVIDIA Jetson系列系统镜像备份烧录指南
  10. Linux中/etc/resolv.conf文件简析