HyperLogLog数据结构

news2024/11/27 5:27:19

基数计数(cardinality counting) 通常用来统计一个集合中不重复的元素个数,例如统计某个网站的UV,或者用户搜索网站的关键词数量。数据分析、网络监控及数据库优化等领域都会涉及到基数计数的需求。
要实现基数计数,最简单的做法是记录集合中所有不重复的元素集合,当新来一个元素,若集合中不包含元素,则将加入,否则不加入,计数值就是的元素数量。这种做法存在两个问题:

  1. 当统计的数据量变大时,相应的存储内存也会线性增长
  2. 当集合变大,判断其是否包含新加入元素的成本变大

在redis 中,如果我们不需要获取数据集的内容,而只是想得到不同值的个数,那么就可以使用HyperLogLog( HLL)数据类型来优化使用集合类型时存在的内存和性能问题。

用法示例:

doitedu03:6379> PFADD HN:CS abc
(integer) 1
doitedu03:6379> PFADD HN:CS bbb
(integer) 1
doitedu03:6379> PFADD HN:CS ccc
(integer) 1
doitedu03:6379> PFADD HN:CS bbc
(integer) 1
doitedu03:6379> PFADD HN:CS bbc
(integer) 0
doitedu03:6379> PFCOUNT HN:CS
(integer) 4
 
doitedu03:6379> PFADD HN:ZZ bbb
(integer) 1
doitedu03:6379> PFADD HN:ZZ ccc
(integer) 1
doitedu03:6379> PFADD HN:ZZ ddd
(integer) 1
doitedu03:6379> PFADD HN:ZZ eee
(integer) 1
doitedu03:6379> PFCOUNT HN:ZZ
(integer) 4
 
doitedu03:6379> PFMERGE HN HN:ZZ HN:CS
OK
doitedu03:6379> PFCOUNT HN
(integer) 6

找规律:
给定N个随机得整数,从右往左数0得个数记录最大的K值,找K和N得关系。
hash算法转换成16位的二进制
在这里插入图片描述

N(我一共去了几个数字)log2NK(最大的0的个数)
340011.7311
350011.7712
400011.9712
410012.0014
910013.1513
920013.1716
970013.2412
980013.2615
990013.2713
1000013.2913

结论:数学结论N ≈ 2^k N是我一共传进去多少个数 K 是最后我数出来0的个数
如果N介于(2k,2k+1),用这种方式估值计算的值都等于2^k,显然误差比较大,所以用加权的方式来降低误差。
加权公式:
在这里插入图片描述

redis中的Hyperloglog

redis使用16384个分桶来实现HLL结构,使标准误差达到0.8125%。
redis使用的散列函数具有64位输出,这意味着它使用前14位来寻找“桶”,剩下的50位用于计算右边的0的数量。正如我们之前看到的,每个存储子集将存储最大的“连0数”,最大可能为50(因为散列中只有50个剩余位可以是0),每个存储子集需要6位才能能够存储最多50个(二进制为110010)。因此我们得到98304个bit来存储1个HLL结构;如果我们将这些bit转换为byte,我们得到6*16384/8 = 12288个byte(或12kb)这就是hyperloglog在redis实现占用的空间大小。

算法原理

Hyperloglog(HLL)是从Loglog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储其所有值。
正如之前所说,常规集合或位图可能非常耗费资源。HLL使用固定大小的结构来解决这个问题,根据实际使用情况,它可以低于16kb。作为低资源需求的代价,基数测量是概率性的,意味着具有小于2%的误差。也就是说:
假设我们有一个1000000个ID的集合,
2%的错误意味着有可能在计算基数时错过1000000个唯一身份用户,为20000
然后,我们可以得到以下两种最坏情况(1000000-20000)= 980.000 || (1000000 + 20000)= 1020000
看起来误差有点多,实际中大多数情况下HLL实现的错误率低于1%。而且由于存在错误率,所以使用HLL表示在其应用场景该误差是可以接受的。

基本原理

HLL的严格数学论证在这里不作解释,通俗来说HLL是通过散列中左边连续0的数量来估计给定集合的基数,因为一个好的哈希算法可以确保我们每个可能的散列具有大致相同的出现概率和均匀分布。这允许HLL算法基于具有最左边0的流的散列来估计它已经“看到”的元素的量。例如,假设我有一个哈希函数,给定一个元素它返回数字0-15的二进制表示:
在这里插入图片描述

其中二进制共有4位,每位出现0的概率是1/2,所以如果连续出现四个0则元素个数至少有16个,那么我如果得到一个左边有k个0元素则至少有2(k)个元素。
但是如果集合中只有一个元素,且元素每一位都是0怎么办,这时候就需要采用HLL中的分桶平均法了。分桶平均的基本原理是将统计数据划分为m个桶,每个桶分别统计各自的最大连续0个数并能得到各自的基数预估值 ,最终求其调和平均数即可,举个例子我们将集合划分为8个子集,那么需要将哈希值的前3位用于子集寻址,后几位从左边统计连续0的个数。
在这里插入图片描述
在这里插入图片描述
分段偏差修正
在HLLC的论文中,作者在实现建议部分还给出了在n相对于m较小或较大时的偏差修正方案。具体来说,设E为估计值:
当E <= 5m/2时,使用LC进行估计。
当 5m/2 < E <= 2(32)/30时,使用上面给出的HLC公式进行估计。
当 E > 2(32)/30时,估计公式如为
关于分段偏差修正效果分析也可以在算法原论文中找到。

严格的数学证明,需要用到伯努利分布,多重伯努利实验以及似然估计等数学知识;参考
https://www.cnblogs.com/linguanh/p/10460421.html
https://www.yuque.com/abser/aboutme/nfx0a4
https://zhuanlan.zhihu.com/p/77289303
https://zhuanlan.zhihu.com/p/26614750

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

34岁出来面试,还被拒绝有多惨?

我强烈建议大家定期去参加一下外面的面试&#xff0c;尤其是BAT大厂的面试&#xff0c;不要一直闷在公司里&#xff0c;不然你很容易被这个世界遗弃。 前言 昨天&#xff0c;我们小组长奉命去面了一个34岁的测试员。 去了大概半个多小时吧&#xff0c;回来后&#xff0c;他的…

图数据库(二):Java操作图数据库

在上篇文章中&#xff0c;我们介绍了什么是Neo4j&#xff0c;什么是Cypher以及Neo4j的使用&#xff0c;今天我们学习一下如何使用Java操作Neo4j图数据库。 Cypher查询 在使用Java操作Neo4j之前&#xff0c;我们先了解一点&#xff0c;Cypher语句简单查询。 本文使用的是Neo4j…

Flutter的状态管理之Provider

Provider简介 Flutter Provider是Flutter中一个非常流行的状态管理库&#xff0c;它可以帮助开发者更加方便地管理应用程序中的状态。Provider提供了一种简单的方式来共享和管理应用程序中的数据&#xff0c;并且可以根据数据的变化来自动更新UI界面。 Provider的核心思想是将…

网络协议——什么是RIP协议?工作原理是什么?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、什么是RIP协议&#xff1f; 二、为什么要使用RIP&#xff1f; 三、RIP用在哪里&#xff1f; 四、RIP协议的工作原理 五、总结 …

Redis安装布隆过滤器

目录 1 什么是布隆过滤器1.1 布隆过滤器的原理1.2 布隆过滤器缺点 2 插件形式安装2.1 下载布隆过滤器插件 3 docker方式单机安装4 Redis集群部署安装4.1 创建目录4.2 redis配置文件4.3 配置docker-compose.yml文件4.4 启动布隆过滤器集群4.5 配置集群4.6 布隆过滤器常用命令4.7…

如何将simulink中的元件(光伏板)导入到plecs中使用

simulink中有一些元件在plecs中是没有的&#xff0c;如果想要直接使用simulink的库&#xff0c;可以这样操作&#xff1a; 1 新建mdl文件&#xff08;simulink的文件类型&#xff09;&#xff0c;并在该文件中搭建好想要的模型、元件&#xff08;只放想要导出的元件就可以了&…

商城检索 DSL

模糊匹配过滤&#xff08;按照属性、分类、品牌、价格区间、库存&#xff09;排序分页高亮聚合分析 一. 搜索关键字 检索字段&#xff1a;商品sku标题 “skuTitle” : “华为 HUAWEI Mate 30 Pro 亮黑色 8GB256GB麒麟990旗舰芯片OLED环幕屏双4000万徕卡电影四摄4G全网通手机”…

基于Java+SpringBoot+Vue前后端分离考试学习一体机设计与实现(视频讲解)

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

docker-compose单机容器集群编排

docker-compose dockerfile模板文件可以定义一个独立的应用容器&#xff0c;如果需要多个容器就需要服务编排。服务编排有很多技术方案 docker-compose开源的项目实现对容器集群的快速编排 docker-compose将所管理的容器分为三层&#xff0c;分别为工程&#xff0c;服务&#…

Jenkins+RF持续集成测试(三) 生成测试报告并发给指定人

在上一篇《定时更新SVN完成构建》中讲了定时从SVN拉取最新的测试脚本&#xff0c;并自动构建的过程。这篇我将介绍怎么配置测试robot报告&#xff0c;并发送给指定人群。 1、要发给指定人&#xff0c;首先需要在job配置&#xff0c;构建后操作中增加“Editable Email Notificat…

day3 ARM寄存器组织

目录 寄存器 ARM寄存器 专用寄存器 CPSR寄存器 寄存器 概念&#xff1a;寄存器是处理器内部的存储器&#xff0c;没有地址&#xff1b; 作用&#xff1a;一般用于暂时存放参与运算的数据和运算结果&#xff1b; 分类&#xff1a;包括通用寄存器、专用寄存器、控制寄存器&…

腾讯云数据库2022下半年本地部署市场收入同比增速达110%,远超市场平均水平

6月7日&#xff0c;记者获悉&#xff0c;据全球领先的IT市场研究和咨询公司IDC发布的《2022年下半年中国关系型数据库软件市场跟踪报告》显示&#xff0c;在Top 5厂商中&#xff0c;腾讯云数据库整体收入同比增速、本地部署模式收入同比增速均位列第一。 具体来看&#xff0c;…

ChatPPT一键制作PPT,效果拉满~

&#x1f4a7; C h a t P P T 一 键 制 作 P P T &#xff0c; 效 果 拉 满 &#xff01; \color{#FF1493}{ChatPPT一键制作PPT&#xff0c;效果拉满&#xff01;} ChatPPT一键制作PPT&#xff0c;效果拉满&#xff01;&#x1f4a7; &#x1f337; 仰望天空&#xf…

网络安全面试题集及答案整理汇总(2023最新版详细)

前言 随着国家政策的扶持&#xff0c;网络安全行业也越来越为大众所熟知&#xff0c;想要进入到网络安全行业的人也越来越多。 为了拿到心仪的Offer之外&#xff0c;除了学好网络安全知识以外&#xff0c;还要应对好企业的面试。 作为一个安全老鸟&#xff0c;工作这么多年&…

如何安装intellij IDEA

想要自学编程&#xff0c;又不知道从那开始&#xff0c;百度找起来比较费劲&#xff0c;现在有个比较便捷的途径&#xff0c;就是直接问chatgpt。 在询问chatgpt后&#xff0c;得知目前比较流行的开发工具是intellij IDEA&#xff0c;然后问了chatgpt怎么下载这个工具&#xf…

当Python程序员好不好?我用自己的亲身经历告诉大家

最近有很多人问我是否考虑转行成为Python程序员&#xff0c;包括一些非计算机专业的学生和工作了几年的人。对于这个问题&#xff0c;我不太好给出建议&#xff0c;只能以我的个人经历来谈一下。我个人认为&#xff0c;我处于整个程序员群体的中位水平线上&#xff0c;因此大家…

开源飞行控制库QGroundControl认识

QGroundControl provides full flight control and vehicle setup for PX4 or ArduPilot powered vehicles. It provides easy and straightforward usage for beginners, while still delivering high end feature support for experienced users. QGroundControl为PX4或Ard…

分布式事务解决方案详解

分布式事务 分布式协议 XA规范 XA&#xff08;eXtended Architecture&#xff09;标准是X/Open 组织针对分布式事务&#xff08;DTP&#xff09;处理的规范&#xff0c;它描述了全局事务管理器和本地资源管理器之间的接口&#xff0c;允许多个资源在同一分布式事务中访问。DT…

Linux——内存和DMA(二)

目录 六、动态内存实例 七、 I/0内存 八、DMA原理及映射 8.1 DMA 工作原理 8.2 DMA映射 1.一致性DMA映射 2. 流式DMA映射 3&#xff0c;分散/聚集映射 4.DMA池 5&#xff0c;回弹缓冲区 九、 DMA统一编程接口 十、习题 书接上回&#xff1a; http://t.csdn.cn/n35…

Redis(二)——Redis持久化与主从架构详解

Redis持久化与主从架构详解 Redis的持久化RDB快照&#xff08;snapshot&#xff09;&#xff08;redis默认持久化方式&#xff09;bgsave的写时复制(COW)机制save与bgsave对比 AOF&#xff08;append-only file&#xff09;配置 Redis 多久才将数据 fsync 到磁盘一次AOF重写 如…