最近在学习如何解决大数据流中的独立元素计数问题。这么讲起来有点抽象,一个很典型的例子是如何实时计算或者估计网站UV。
针对类似问题,很容易想到一个简单的办法:我们可以先对数据排序,然后再统计。可这种方法却无法应对大数据现实,因为在大数据场景下,诸如网站UV的数值,每天可能达到上亿,这就导致计算的时间及空间复杂度很高,因而很难满足实时要求。
Flajolet-Martin算法较好的解决了独立元素计数问题;当然,它是一个估计值,能在极大降低空间复杂度的前提下,提供业务方可接受的估值精度。
简单描述下自己的认识,关于”为什么FM算法估值比较精确“:
首先,我们容易理解:”在一个整数集中,每2^ K个数后就会出现一个尾部K个0组成的比特序列“;
我们将数据流中的每个元素,通过哈希函数映射为一个随机整数;
同时我们针对每个哈希函数的结果集,统计每个随机整数尾部的全0比特序列长度(尾部有多少个连续0),记录该长度最大值,即为R;
这时,我们认为2^R 可以作为数据流中不重复元素个数的估计值。假设数据流中有M个非重复元素,忽略理论证明,可以有如下结论:
当M >> 2^r 时,那么发现一个尾部长度至少为 r 的概率接近1;( 反过来想,我们取了所有r值中的最大值R,则R不会过小。)
当M << 2^r 时,那么发现一个尾部长度至少为 r 的概率接近0;(说明2^R不会过大)
基于上述两条结论,我们可以认为 M的估计值2^R不可能过高或过低。
关于Flajolet-Martin算法,我推荐如下一篇博客文章,觉得讲解的很通俗易懂:
[转]Flajolet-Martin算法及其应用
其主要内容如下:*************************************************************************************************************************************************************************
假定哈希函数H(e)能够把元素e映射到[0,