C/C++教程

cpc、hyperloglog原理简述

本文主要是介绍cpc、hyperloglog原理简述,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

cpc原理简述:
cpc、hyperloglog等是使用概率思想实现“去重计数”的方法,该类方法不直接存储数据集合本身,而是通过一定的概率统计方法预估数据集中不重复元素的个数,这种方法可以大大节省内存,同时保证误差控制在一定范围内。
1、基本概率思想
伯努利试验:一次实验只有两种结果,比如抛硬币结果只能是正面朝上或者反面朝上。
n重伯努利试验:进行多次伯努利试验,比如抛10次硬币。

如果在一次n重伯努利试验中关注的是 第一次出现正面时,跑硬币的次数k,然后进行多次这样的n重伯努利试验,会有如下结果,0代表反面、1代表正面:
第一次试验: 抛了3次才出现正面,此时 k=3,记为:001
第二次试验: 抛了2次才出现正面,此时 k=2,记为:01
第三次试验: 抛了6次才出现正面,此时 k=6,记为:000001
第四次试验: 抛了1次才出现正面,此时 k=1,记为:1

第m次试验: 抛了2次才出现正面,此时 k=2,记为:01

通过研究上述试验中 最大的k 与 试验总次数 m的关系,由极大似然估计可得到:m=2max(k),比如上述试验通过最大k值6估计m的值是=26,代表:通过概率估计,共进行了2的6次方次试验。由此见,该公式误差比较大,特别是在小数据量情况下,所以基于该公式做了多个版本的精度优化(多次分组试验求平均、求调和平均等),最终形成了cpc、hyperloglog(误差一般可以控制在1%以下)等算法。

注意:k代表的是“在对应的试验中,第k次跑硬币时,出现了正面朝上。对于第三次试验的“000001”也可表述为:第一个1出现的位置是6。

2、如何将m=2^max(k)应用于“近似计算”
比如某二级部门下的用户有uuid1,uuid2,uuid3…,先将这些uuid对应的字符串做hash转换成”01001000”、”01010100”、”01001010”的串,然后找到这些01串中第一个1(从右至左)出现位置最大的位置值,比所列举的3个01串,第一个1出现位置依次是4、3、2,所以最大的位置max(k)是4,通过m=2^max(k)公式即可估计共有多少个uuid。

https://zhuanlan.zhihu.com/p/77289303
https://blog.csdn.net/redenval/article/details/85205453
https://zhuanlan.zhihu.com/p/77289303?ivk_sa=1025922x
https://www.cnblogs.com/linguanh/p/10460421.html
https://juejin.cn/post/6844903785744056333#heading-6
https://blog.csdn.net/u010670689/article/details/82181401?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-7-82181401.pc_agg_new_rank&utm_term=HyperLogLog+%E5%81%8F%E5%B7%AE&spm=1000.2123.3001.4430

这篇关于cpc、hyperloglog原理简述的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!