HyperLogLog
基数计数,不绝对准确。省空间,速度快
估计基数,对数级空间节省
可以理解为一种压缩,把基数压缩成二进制位数,只存储位数,如果旧有的数据再加入时肯定不会改变位数。
反之回复成基数是2的幂,所以是个近似值。
多桶理解为多个位数,求平均数来近似,防止二的幂的近似太粗犷。
记得以前有个猜日期游戏,数据分五组
A:1,3,5,7, 9, 11,13,15,27,19,21,23,25,27,29,31
B:2,3,6,7,10,11,14,15,18,19,22,23,26,29,30,31
C:4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31
D:8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31
E: 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
游戏规则是:在上面五组中找出你的生日日期,把组名告诉对方,对方猜测你的生日日期,
例如告诉对方在abc三组,那么日期就是1+2+4=7
如果是ade三组,日期就是1+8+16=25,
依此类推,告诉是在哪个组就把组的第一个数字加一起,即是所求
HyperLogLog也是类似的算法,只不过把数据压缩,无法完全还原,反向计算找一个近似值,多桶计算多个近似,计算调和平均数。
有人说redis的桶个数是16834,我怎么想怎么不对。这个数太像2的14次幂16384了,怀疑是笔误,于是下载了redis源码,hyperloglog.c文件中,查看发现有16384这个数,没有16834这个数。
和hash算法类似思想,按照规则来计算,结果天知道、鬼知道、反正我不知道。