Redis源码中hyperloglog结构的实现原理是啥( 七 )


其实也可以用近似值来代替,毕竟如下公式的计算是有一定的成本的。
Redis源码中hyperloglog结构的实现原理是啥

近似的值为 Redis源码中hyperloglog结构的实现原理是啥
Redis源码中hyperloglog结构的实现原理是啥
Redis源码中hyperloglog结构的实现原理是啥
Redis源码中hyperloglog结构的实现原理是啥
Redis源码中hyperloglog结构的实现原理是啥

HyperLogLog 的案例分析有一个关于 HyperLogLog 的 demo 网站可以看到 HyperLogLog 的算法过程,其链接是 http://content.research.neustar.biz/blog/hll.html
在这个 demo 中,作者对比了 LogLog 和 HyperLogLog 的区别和运行过程,有助于大家理解整个过程。其中 LogLog 与 HyperLogLog 的区别就在与它们平均值的处理方式不一样,前者是使用算术平均值,后者是使用调和平均值。
LogLog: Redis源码中hyperloglog结构的实现原理是啥
HyperLogLog: Redis源码中hyperloglog结构的实现原理是啥
Redis源码中hyperloglog结构的实现原理是啥

HyperLogLog Demo:初始化Redis源码中hyperloglog结构的实现原理是啥

第一个 hash 值:38521724293852172429 的二进制是:11100101100110110111110010001101,可以划分为100 110110111110010 001101。最后的六位是 001101,十进制就是 13,那么这个数字就会被放入第 13 个桶;而 110110111110010(从低位到高位看), Redis源码中hyperloglog结构的实现原理是啥
函数的值就是 2;于是在第 13 个桶就会把 0 更新成 2。
Redis源码中hyperloglog结构的实现原理是啥

第二个 hash 值:25456984992545698499 的二进制是 10010111101111000100011011000011,用同样的分析可得结论。
Redis源码中hyperloglog结构的实现原理是啥

第三个 hash 值:25776998152577699815 的二进制是 10011001101001001001001111100111。
Redis源码中hyperloglog结构的实现原理是啥

第四个 hash 值:775376803775376803 的二进制是 101110001101110100111110100011。
Redis源码中hyperloglog结构的实现原理是啥

运行结束从以上的 Demo 运行过程可以看出,整个 HyperLogLog 的算法逻辑还是相对清晰的,其整个算法的亮点应该在于借助了抛硬币的场景,用抛硬币的结果来估算抛硬币的次数。


推荐阅读