Bloom Filters Count-Min Sketch

2024-02-03 05:38
文章标签 sketch count min bloom filters

本文主要是介绍Bloom Filters Count-Min Sketch,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今日看了两个基于概率的数据结构(Probabilistic data structures)
Bloom Filters 和 Count-Min Sketch,基本思想相类似。

其实是两个实现简单的算法,但是需要用到一定的数学原理。

但本文仅介绍方法,不介绍数学原理。

Bloom Filters

问给出的数是否在集合 S S S 中,集合可增可删,且集合中数的取值范围 w w w 较大,设 w ≤ 1 0 18 w\le 10^{18} w1018

简单版

通过哈希函数 H H H,对于给定的数 x x x,将 y = H ( x ) y=H(x) y=H(x)(比如 y ≤ 1 0 5 ) y\le 10^5) y105,存在 bitset 中,通过 0/1 来表示是否在 S S S 中出现,这样可以极大的节省空间。

升级版

根据生日攻击原理,我们可以知道,当 ∣ S ∣ |S| S 较大时,会有较大的概率产生冲突。

所以考虑使用多个哈希函数 H k H_k Hk

则对于集合 S S S 中的数 x x x ∀ i ≤ k , y i = H k ( x ) \forall i \le k, y_i=H_k(x) ik,yi=Hk(x),则令 b i t s e t [ y i ] = 1 bitset[y_i]=1 bitset[yi]=1

若要判断 x x x 是否在 S S S 中,则要求 ∀ i ≤ k , y i = H k ( x ) \forall i \le k, y_i=H_k(x) ik,yi=Hk(x) b i t s e t [ y i ] = 1 bitset[y_i]=1 bitset[yi]=1

此网址下有演示 demo。

可删除

如果想要删除的话,为了避免两个不同的数相互干扰,我们改成计数版本。

即:

则每添加一个数 x x x ∀ i ≤ k , y i = H k ( x ) \forall i \le k, y_i=H_k(x) ik,yi=Hk(x),则令 b i t s e t [ y i ] + = 1 bitset[y_i]\color{red}{+=1} bitset[yi]+=1

如要删除一个数 x x x,则 ∀ i ≤ k , y i = H k ( x ) \forall i \le k, y_i=H_k(x) ik,yi=Hk(x),则令 b i t s e t [ y i ] − = 1 bitset[y_i]\color{red}{-=1} bitset[yi]=1

Count-Min Sketch

问给出的数是否在可重集合 S S S 中,集合可增可删,且集合中数的取值范围 w w w 较大,设 w ≤ 1 0 18 w\le 10^{18} w1018

简单版

同 Bloom Filters 类似,通过哈希函数 H H H,对于给定的数 x x x,将 y = H ( x ) y=H(x) y=H(x)(比如 y ≤ 1 0 5 ) y\le 10^5) y105,存在数组 A [ y ] A[y] A[y] 中,通过 A [ y ] A[y] A[y] 的值来得出在 S S S 中出现的次数,这样可以极大的节省空间。

升级版

根据生日攻击原理,同理。

所以考虑使用多个哈希函数 H k H_k Hk

设使用了 k k k 个,则我们定义一个二维数组 A [ k ] [ ] A[k][] A[k][]

则对于集合 S S S 中的数 x x x ∀ i ≤ k , y i = H k ( x ) \forall i \le k, y_i=H_k(x) ik,yi=Hk(x),则令 A [ i ] [ y i ] + + A[i][y_i]++ A[i][yi]++

若要求得 x x x S S S 中的出现次数,则为

min ⁡ i ≤ k , y i = H i ( x ) A [ i ] [ y i ] \min_{i\le k,y_i=H_i(x)} A[i][y_i] ik,yi=Hi(x)minA[i][yi]

此网址下有演示 demo。

这篇关于Bloom Filters Count-Min Sketch的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/673126

相关文章

我与Bloom filter

1 海量网页判断用Bloom Filter 面试的时候,一个面试官问我说:“有一个网络爬虫,爬虫程序会不停地爬取页面上的每一个网页,并把爬取后的网页给存储起来,那么爬虫如何判定现在在爬的网页有没有被爬过。” 我当时卡住了半天回答不上来。 面试官给我说用Bloom Filter。 Bloom Filter把爬取过的网页映射到Bloom Filter内,如果再爬取到该网页,Bloom Filt

Flink SQL因类型错误导致MAX和MIN计算错误

背景 最近在做数据分析,用Flink SQL来做分析工具,因数据源的数据存在不太规范的数据格式,因此我需要通过SQL函数把我需要的数据值从VARCHAR类型的字段中把数据提取出来,然后再做MAX、MIN、SUM这些统计。怎料SUM算出来的结果准确无误,而MAX和MIN算出来的结果却始终不正确,最后发现原来是我用SQL函数提取VARCHAR类型的字段的数据,也是VARCHAR类型,所以导致MAX、

count(distinct ...) over (partition by...) 替换成mysql

你这个是用了 Oracle 的分析函数。 SQL Server 是不支持的。如果语句比较简单的。例如SELECT COUNT( distinct A) OVER ( partition by B) FROM C可以修改为:SELECT COUNT( distinct A) FROM CGROUP BY B但是如果你的逻辑很复杂的话,那就麻烦了。

Spark算子:RDDAction操作–first/count/reduce/collect/collectAsMap

first def first(): T first返回RDD中的第一个元素,不排序。 scala> var rdd1 = sc.makeRDD(Array(("A","1"),("B","2"),("C","3")),2)rdd1: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[33] at mak

【SQL】count(1)、count(*) 与 count(列名) 的区别

在 SQL 中,COUNT 函数用于计算查询结果集中的行数。COUNT(1)、COUNT(*) 和 COUNT(列名) 都可以用来统计行数,但它们在实现细节和使用场景上有一些区别。以下是详细的解释: 1. COUNT(1) 定义: COUNT(1) 计算查询结果集中的行数。实现: 在执行过程中,COUNT(1) 会将 1 作为一个非空的常量值,并对每一行进行计数。效率: 现代的 SQL 优化器

vm.max_map_count是什么?起到什么作用

vm.max_map_count 是 Linux 内核中的一个参数,它决定了一个进程可以拥有的最大内存映射区域数。内存映射区域是指内存映射文件、匿名内存映射等。这个参数对于一些应用程序(如 Elasticsearch)特别重要,因为它们在运行时会创建大量的内存映射区域。 详细解释 内存映射(Memory Mapping) 内存映射是一种将文件或设备的内容映射到进程的地址空间的机制。通过内存映

sql count()加distinct和条件去重统计

表数据: userid userType------------------------------------------A 1B 1B 1C 2 需求:查出userType=1和userType=2的用户数,并且直接用字段展示出来,可能还有很多其他类型,也

五十一、openlayers官网示例Layer Min/Max Resolution解析——设置图层最大分辨率,超过最大值换另一个图层显示

使用minResolution、maxResolution分辨率来设置图层显示最大分辨率。  <template><div class="box"><h1>Layer Min/Max Resolution</h1><div id="map" class="map"></div></div></template><script>import Map from "ol/Map.js";im

PAT 甲级 1093 Count PAT‘s

#include <bits/stdc++.h>using namespace std;#define kMOD 1000000007int main(){#ifdef LOCALfreopen("input.txt", "r", stdin);#endifstring s;cin >> s;// 在位置i之前(包括位置i)有多少个P,位置i之后(包括位置i)有多少个Tvector<i

mysql count(1),count(0)的区别

了解COUNT(1)和COUNT(0)的区别,我们需要深入探讨SQL中的聚合函数和它们的执行方式: COUNT(1): COUNT(1)中的1是一个字面量,它在查询的每行中都是相同的。这个函数的目的是计算结果集中的总行数。由于1是一个不变的值,数据库不需要访问表中的实际数据列,因此某些数据库可能会优化这类查询。 COUNT(0): COUNT(0)计数的是结果集中列值为0的行数。然而,在大多数