项目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. android 虚方法,尝试在空对象引用上调用虚方法’android.view.View android.view.View.getRootView()’...
  2. openstack之虚拟机管理命令
  3. Websocket总结
  4. java线程死亡_java – 如何暂停main()直到所有其他线程死亡?
  5. 奥鹏计算机基础18秋在线作业答案,18秋华师《计算机基础》在线作业1(标准答案).doc...
  6. 顶会VLDB‘22论文解读:CAE-ENSEMBLE算法
  7. java的数组(二维)
  8. 力扣—— 51. N 皇后
  9. dubbo负载均衡代码分析2(一致性hash策略)
  10. 设计程序时,注意和外系统连携相关的处理
  11. 优秀代码所具备的5大品质 你的代码呢?
  12. (六)Value Function Approximation-LSPI code (3)
  13. 疯狂涨知识!最全的java手机游戏免费下载基地
  14. sop8封装尺寸图_IC封装原理及功能特性汇总
  15. 精心整理了7种常用数据分析方法(建议收藏)
  16. JAVA之设置背景图片的几种方法
  17. 字节跳动面试--二面算法题复盘
  18. 詹姆斯高斯林_詹姆斯·高斯林(James Gosling)警告《银翼杀手》的未来
  19. clojure实战——宏
  20. 静态存储区与动态存储区

热门文章

  1. JavaScript设计模式入坑 1
  2. Java并发编程之原子类
  3. 关于Spring Cloud Netflix
  4. 0538-实战将lnmp服务中的上传目录独立分离到nfs服务器
  5. audio.js的研究与使用
  6. 网站静态化处理--总述(1)
  7. Python实战(3)指定的文本列求和求平均
  8. MagicMongoDBTool 最新代码 以及 开发进度报告
  9. [CTO札记]李彦宏:《领导者的心态——Best of the best》
  10. Windows Server 2003 R2中的DFS复制与管理