hyperloglog算法思路简介

本文介绍了HyperLogLog算法,一种高效估计大数据集中不重复元素数量的统计学方法。通过观察稀有事件推断总体规模,利用哈希函数映射元素至二进制位,以估算不重复元素数。算法虽有误差,但通过改进如分组技术,可显著提高精度,广泛应用于内存受限的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法没详细看,有兴趣的可以读原始论文: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值