hyperloglog算法思路简介

算法没详细看,有兴趣的可以读原始论文:http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf , 不过最顶层的思路get了

首先这个算法的目的是求一堆元素当中不重复元素的数量,例如, a, b, a, c中不重复的元素只有a, b,c 3个,那么结果就是3.

在面对巨大数据量时,这个问题的常规解法会变得非常消耗内存,即使用计算机存储的基本单位一个比特来代表一个元素,在海量数据时,仍显得力不从心。

 

但是仔细想,难道还有比用比特更省空间的吗?想来是没有了。

 

那么hyperloglog算法就是一种基于统计学的方法,既然是基于统计学的方法,那么这种方法就会“有误差”,只不过通过一些计算可以让误差变得更小。

 

这种统计学方法的思路是什么呢?网上有各种用抛硬币来类比的,我看不用说得那么复杂,只要一句话就能得到这种方法的顶层思路:

“如果你看见一个万中无一的人(即这种人出现的概率为1/10000),那么你知道这个世界大概率至少有一万个人”

这是一种见微知著的方法,基于个体样本的总体反推。

 

再细化一步,如果我们把所有的元素通过某个hash函数映射成二进制位(hash函数足够分散,足够平均到整个空间),像101011, 011001, 000101这种,然后对任意一个元素用上面的顶层思路进行反推,可以得到一个总体不重复样本数的估算值,例如可以认为直接以1开头的元素出现的概率是1/2,那么可以认为总体元素数大概率超过2个,然后出现000101这种元素,前面以3个0开头,认为这种元素出现的概率是1/8,那么总体样本数的估算就认为至少是8个,对所有元素都这么估一次,取最大值,就可以得到一个不重复元素数的估计。

 

当然,以上的说法肯定误差巨大,并且对hash函数的随机性要求非常高,所以具体实践时,还有很多改进细节,例如分组之类的,改进完之后可以做到非常省内存,且准确度非常高。

 

redis有一个数据结构hyperloglog就是用这种方法实现不重复元素数统计的,大家有兴趣可以自己去看看(参考这里:https://www.tutorialspoint.com/redis/redis_hyperloglog.htm)

 

细节我就懒得看了,不想花时间去深入研究这个算法了,就看个思路。

 

另一个好的中文帖子介绍如下:https://www.jianshu.com/p/55defda6dcd2

你可能感兴趣的:(算法与数据结构)