项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.bloom filter

布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

2.两种错误率FP/FN

FP = A false positive error, or in short a false positive, commonly called a “false alarm”, is a result that indicates a given condition exists, when it does not.FN = A false negative error, or in short a false negative, is a test result that indicates that a condition does not hold, while in fact it does.

在bloom filter中,FP是集合里没有某元素,查找结果是有该元素。FN是集合中有某元素,查找结果是没有该元素。

在bloom filter中,FP 会随着 BF 中插入元素的数量而增加——极限情况就是所有 bit 都为 1,这时任何元素都会被认为在集合里。而FN则为0,如果某元素在集合中,则一定能找到该元素。

3.FP的推导

假设哈希函数以相等的概率选择位数组中的位置。如果 m 是位数组中的比特数,则在插入元素期间某一特定比特位不被某个哈希函数设置为 1 的概率是:

1−1m1- \frac{1}{m}1−m1​
假设有k个哈希函数,则通过 k 个哈希函数都未将该位设置为 1 的概率是
(1−1m)k(1- \frac{1}{m}) ^ k(1−m1​)k

那么,如果我们插入了 n 个元素,某个位仍然为 0 的概率就是:

(1−1m)nk(1- \frac{1}{m}) ^ {nk}(1−m1​)nk

因此这一位的值为 1 的概率就是:

1−(1−1m)nk1 - (1- \frac{1}{m}) ^ {nk}1−(1−m1​)nk

那么,BF 的误判率是怎么得出的?前面提到,我们主要关注 FP,即集合里没有某元素,查找结果是有该元素。

现在我们要判断一个元素是否在集合中,假设这个元素本不在集合中,理论上来讲,经过 k 个哈希函数计算后得到的位数组的 k 个位置的值都应该是 0,如果发生了误判,即这 k 个位置的值都为 1,这个概率如下:

(1−(1−1m)kn)k=(1−e−knm)k(1 - (1- \frac{1}{m}) ^ {kn}) ^ k = (1- e^{-\frac{kn}{m}})^k(1−(1−m1​)kn)k=(1−e−mkn​)k

4.stream lib中的bloom filter

    public void test2() {Filter filter = new BloomFilter(1000, 0.01);filter.add("abc");filter.add("def");filter.add("g");boolean result = filter.isPresent("123");System.out.println("result is: " + result);}

Filter filter = new BloomFilter(1000, 0.01); 1000是在构建BitSet时跟bit数组位数有关的参数,0.01是错误率。

5.Count-Min Sketch算法

CountMinSketch 是一种“速写”算法,能够使用较小的空间勾勒出数据集内各类事件的频次。比如,我们可以统计出当前最热门的推特内容,或是计算网站访问量最大的页面。当然,这一算法同样会牺牲一定的准确性。

CountMinSketch算法的流程:
1.选定d个hash函数,开一个 dxm 的二维整数数组作为哈希表
2.于每个元素,分别使用d个hash函数计算相应的哈希值,并对m取余,然后在对应的位置上增1,二维数组中的每个整数称为sketch
3.要查询某个元素的频率时,只需要取出d个sketch, 返回最小的那一个(其实d个sketch都是该元素的近似频率,返回任意一个都可以,该算法选择最小的那个)

6.Count-Mean-Min Sketch

Count-Min Sketch算法对于低频的元素,结果不太准确,主要是因为hash冲突比较严重,产生了噪音,例如当m=20时,有1000个数hash到这个20桶,平均每个桶会收到50个数,这50个数的频率重叠在一块了。Count-Mean-Min Sketch 算法做了如下改进:
1.来了一个查询,按照 Count-Min Sketch的正常流程,取出它的d个sketch
2.对于每个hash函数,估算出一个噪音,噪音等于该行所有整数(除了被查询的这个元素)的平均值
3.用该行的sketch 减去该行的噪音,作为真正的sketch
4.返回d个sketch的中位数

class CountMeanMinSketch {// initialization and addition procedures as in CountMinSketch// n is total number of added elementslong estimateFrequency(value) {long e[] = new long[d]for(i = 0; i < d; i++) {sketchCounter = estimators[i][ hash(value, i) ]noiseEstimation = (n - sketchCounter) / (m - 1)e[i] = sketchCounter – noiseEstimator}return median(e)}
}

Count-Mean-Min Sketch算法能够显著的改善在长尾数据上的精确度。

参考文献
1.https://zh.wikipedia.org/wiki/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8
2.http://shzhangji.com/cnblogs/2017/08/27/an-introduction-to-stream-lib-the-stream-processing-utilities/
3.https://soulmachine.gitbooks.io/system-design/content/cn/bigdata/frequency-estimation.html

BloomFilter, Count-Min Sketch算法相关推荐

  1. Count Min Sketch: from Finding the Majority Element problem to heavy hitter problem,统计元素频率的利器

    这是笔者学习 Stanford cs 168 课程的一些学习笔记 lecture 2, 主要讲一个基于 hash 和独立试验思想,设计的一种数据结构 count min sketch,想法非常类似于 ...

  2. Sketch算法-CM Sketch、Count Sketch等

    sketch sketch统计网络数据流中某个元素出现的频率,反应数据流的特征.并不实际的存储数据流中的元素,只存储他们的计数. 基本原理是数组每个单元维持一个计数器,当数据流的元素哈希索引到数组的某 ...

  3. Count-Min sketch算法

    给定数据流< 4,1,3,5,1,3,2,6,7,0,9 >,若哈希函数形如h(x)= (ax + b) mod 8,其中a和b是任意给定的常数.假设给定如下哈希函数: (1) h(x) ...

  4. 【坑】Sketch算法——Count-Min Sketch和Universal Sketch

    文章目录 参考链接 一.Sketch算法用来做什么? 二.Min-count sketch 基础思想: 进阶: 特点: 三.Universal Sketch 参考链接 [1] Count-Min Sk ...

  5. JAVA:实现BloomFilter二进制向量数据结构算法(附完整源码)

    JAVA:实现BloomFilter二进制向量数据结构算法 package com.thealgorithms.datastructures.bloomfilter; import java.util ...

  6. 最小割(min cut)算法

    0引言 图像分割可以看作不同的划分问题,而图可以进行不同的划分,将图像映射为图后,分割问题就可以用图论方法(如:最小割)求解.这只是直观地解释,具体如何将图像分割转化为求图的最小割呢?本文的分析思路是 ...

  7. mysql min函数 结果全为null_MySQL ----- 聚集函数(AVG,SUM,COUNT,MIN,MAX) (十一)

    为了汇总数据而不把实际的检索出来,MySQL 提供了专门的函数,聚集函数 好处:可以将检索数据进行分析和报表生成 一.聚集函数(aggregate function): 运行在行组上,计算和返回单个值 ...

  8. 【算法与数据结构】一道检测inversion count的初级算法

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.题目 这是一道检测inversion count的算法.它将检测输入序列中反序输入的个数,即检测其中有几对A ...

  9. min java_LeetCode算法题-Min Stack(Java实现)

    这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小 ...

  10. 万字详解本地缓存之王 Caffeine

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自:r6d.cn/UXR4 概要 Caffeine[1] ...

最新文章

  1. POJ 1260 Pearls(DP)
  2. mysql proxy性能差_mysql性能的检查和优化方法
  3. 夏季防暑降温小常识汇总 - 生活至上,美容至尚!
  4. Mockito教程--思维导图笔记
  5. new、delete与malloc、free的详解
  6. postgresql表中间加列_PostgreSQL ALTER TABLE命令
  7. “有 些 事 当 了 程 序 员 才 懂”
  8. linux系统内核参数命令,Linux内核启动参数解析及添加
  9. iOS各个版本的新特性介绍
  10. 【JavaScript】图表分析
  11. VMware 14 版本激活许可证
  12. 计算机管理的显卡驱动,显卡驱动,教您显卡驱动怎么安装
  13. magic4.0跟harmonyos,支持升级Harmony 2.0 Magic UI 4.0 9月中旬招募公测
  14. 微信支付功能测试用例
  15. Toefl-Speaking
  16. 初识c语言加操作系统
  17. 服务器装系统步骤图解win7,win7 硬盘重装系统步骤图解|win7系统硬盘重装教程
  18. 第 6 篇、Linux C基础 | 数据类型和标识符
  19. 奢潮自信即刻拥有,KOREANO ESSENTIAL春夏系列上市
  20. OSM地图本地发布(一)-----概述

热门文章

  1. 多线程3,线程池封装库
  2. windows server 2003产生的 Minidmp蓝屏文件分析求助
  3. Linux之 find之 ctime,atime,mtime
  4. linux高级安全ssh限制利用PAM
  5. Android Makefile and build system 分析
  6. 近乎 5.3 发布,SNS 社区系统
  7. Windows server 2012远程桌面会话主机和远程桌面授权,server2012
  8. centos7 redis配置
  9. 从源码编译安装TensorFlow
  10. mongodb日志分析工具mtools之mplotqueries