| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> redis技术总结(2)—— Hyperloglog通俗版总结 -> 正文阅读 |
|
[大数据]redis技术总结(2)—— Hyperloglog通俗版总结 |
Redis提供了hyperloglog算法的实现,为了通俗易懂讲人话,我先省去大量原理讲过程,再提原理中几个重要的点,当然有更多精力和能力的还是直接看数学推导比看csdn强。 1、hll目标首先,hyperloglog的场景来源是:
一般而言,优化一个算法的方式大概率就是(1)完全换一种方式(2)近似计算,hyperloglog就是一种近似计算,用一定的错误率,优化大量增加元素带来的空间占用。 他的数学来源就是概率论中的伯努利试验,连续抛三次硬币,第一次出现正面的概率是多少?那你应该能机制的答出来,第一次反面1/2,第二次反面1/2,第三次正面1/2,抛三次第一次出现正面的概率概率1/8。那么反过来,至少抛多少轮次(注意不是次数,是多少轮次至少一次抛硬币结果001)硬币,才能在第三次抛硬币时,第一次出现正面,那你大概也能说出来,至少8次。 2、为了达到目标,数学理论的支持hyperloglog估算数据量的做法和这个类似,你可以感受到,hll就是用概率的方法估算样本的容量,那么一定是有误差的,而且也一定为了去减小这个误差提供优化的方式,比如欧皇第一轮次直接001,非酋就是100次了,也抛不出001,抛的都是些010,100,110之类的怪东西,显然这个时候,算数平均数能做的十分有限,核心就是算数平均数不能防止突变值的影响,而且会很大,比如非酋和欧皇平均值50,实际上概率上只有8。 也因此引出了hll的第二个关键点,调和平均数。调和平均数的计算公式: 看一眼你就懂,比如刚刚的非酋和欧皇的调和平均数H = 2/(1/1+1/100)=2,这明显比算数平均数考虑,因为你能感觉到,他是向某个值收敛的(比如做了100次,每次都恰好8,那就是完美的8),而不是发散的(省略数学证明)。那我们取更合理的值试一试: 比如序列为了达成001序列,各个挑战者们达成了7,8,9,8,12,15,和突变值50, 理论正确值:8 利用算数平均数计算得到结果:15.57 利用调和平均数计算得到:10.39 当然,为了提升hll的正确率,扣穴家还想到了用分桶的思路,计算每个桶预计结果的加权平均值,进一步提升准确率,没有复杂计算,时间复杂度上没什么负担,总之最后的最后,得到了计算估计数量的公式:const和分桶的数量m有关,p=log2?m 3、 Redis的实现redis实现就提供了三个函数,实现一个类似set的功能,毕竟从使用层面来说,我就是希望它是一个set,虽然hll只是一种算法。 一个pfadd,提供添加元素功能(类似set的add),一个pfcount,获取我当前预估的uv(类似set的size()),一个pfmerge合并两页面的uv(类似addAll)。
以上 巨人的肩膀: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 12:23:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |