counting
在上文中,我们知道传统的精确基数计数算法在数据量大时会存在一定瓶颈,瓶颈主要来自于数据结构合并和内存使用两个方面。因此出现了很多基数估计的概率算法,这些算法虽然计算出的结果不是精确的,但误差可控,重要的是这些算法所使用的数据结构易于合并,同时比传统方法大大节省内存。
在这一篇文章中,我们讨论Linear Counting算法。
简介
Linear Counting(以下简称LC)在1990年的一篇论文“A linear-time probabilistic counting algorithm for database APPlications”中被提出。作为一个早期的基数估计算法,LC在空间复杂度方面并不算优秀,实际上LC的空间复杂度与上文中简单bitmap方法是一样的(但是有个常数项级别的降低),都是
基本算法
思路
LC的基本思路是:设有一哈希函数H,其哈希结果空间有m个值(最小值0,最大值m-1),并且哈希结果服从均匀分布。使用一个长度为m的bitmap,每个bit为一个桶,均初始化为0,设一个集合的基数为n,此集合所有元素通过H哈希到bitmap中,如果某一个元素被哈希到第k个比特并且第k个比特为0,则将其置为1。当集合所有元素哈希完成后,设bitmap中还有u个bit为0。则:
为n的一个估计,且为最大似然估计(MLE)。
示意图如下:
推导及证明
(对数学推导不感兴趣的读者可以跳过本节)
由上文对H的定义已知n个不同元素的哈希值服从独立均匀分布。设
又每个桶是独立的,则u的期望为:
当n和m趋于无穷大时,其值约为
令:
得:
显然每个桶的值服从参数相同0-1分布,因此u服从二项分布。由概率论知识可知,当n很大时,可以用正态分布逼近二项分布,因此可以认为当n和m趋于无穷大时u渐进服从正态分布。
因此u的概率密度函数为:
由于我们观察到的空桶数u是从正态分布中随机抽取的一个样本,因此它就是
又由如下定理:
设
且
偏差分析
下面不加证明给出如下结论:
其中
以上结论的推导在“A linear-time probabilistic counting algorithm for database applications”可以找到。
算法应用
在应用LC算法时,主要需要考虑的是bitmap长度m的选择。这个选择主要受两个因素的影响:基数n的量级以及容许的误差。这里假设估计基数n的量级大约为N,允许的误差为
误差控制
这里以标准差作为误差。由上面标准差公式可以推出,当基数的量级为N,容许误差为
将量级和容许误差带入上式,就可以得出m的最小值。
满桶控制
由LC的描述可以看到,如果m比n小太多,则很有可能所有桶都被哈希到了,此时u的值为0,LC的估计公式就不起作用了(变成无穷大)。因此m的选择除了要满足上面误差控制的需求外,还要保证满桶的概率非常小。
上面已经说过,u满足二项分布,而当n非常大,p非常小时,可以用泊松分布近似逼近二项分布。因此这里我们可以认为u服从泊松分布(注意,上面我们说u也可以近似服从正态分布,这并不矛盾,实际上泊松分布和正态分布分别是二项分布的离散型和连续型概率逼近,且泊松分布以正态分布为极限):
当n、m趋于无穷大时:
因此:
由于泊松分布的方差为
综上所述,当基数量级为N,可接受误差为
其中
下图是论文作者预先计算出的关于不同基数量级和误差情况下,m的选择表:
可以看出精度要求越高,则bitmap的长度越大。随着m和n的增大,m大约为n的十分之一。因此LC所需要的空间只有传统的bitmap直接映射方法的1/10,但是从渐进复杂性的角度看,空间复杂度仍为
合并
LC非常方便于合并,合并方案与传统bitmap映射方法无异,都是通过按位或的方式。
小结
这篇文章主要介绍了Linear Counting。LC算法虽然由于空间复杂度不够理想已经很少被单独使用,但是由于其在元素数量较少时表现非常优秀,因此常被用于弥补LogLog Counting在元素较少时误差较大的缺陷,实际上LC及其思想是组成HyperLogLog Counting和Adaptive Counting的一部分。
在下一篇文章中,我会介绍空间复杂度仅有
相关阅读
由于最近在学习算法相关的东西,发现课后的习题没有答案,给我造成很大困扰,以下分享了从网上找到的答案链接: https://pan.baidu.com/
import java.util.HashMap; import java.util.HashSet; import java.util.Map.Entry; /** * * Dijkstra算法 * 适用范围:没有
先解释下:MD5是不可逆,这里的加密解密,你可以看到是对MD5算法先加密后解密,而不是对MD5的解密package com.test; import java.secur
2015年元旦对于很多中国人来说是一个欢快的节日,但是对于一些互联网站长来说则是一个黑暗的日子,自2015年1月3日开始中国最大的互联
论文:Non-local Neural Networks for Video Classification 论文链接:https://arxiv.org/abs/1711.07971 代码链接:https://github.c