基数计数——HyperLogLog
所谓的基数计数就是统计一组元素中不重复的元素的个数。如统计某个网站的UV,或者用户搜索网站的关键词数量;再如对一个网站分别统计了三天的UV,现在需要知道这三天的UV总量是多少,怎么融合多个统计值。
1、方法
(假设元素个数为m,去重后个数为n)
1、集合操作去重
时间复杂为O(m2),空间复杂度随元素个数线性增长。数据量一大就崩了。
2、B+树
将数据插入到B+树中达到去重目的,然后顺序访问叶节点链从而得到n值。时间复杂的为O( lgm + n ),内存亦随元素个数线性增长。数据量一大就崩了。
3、BitMap
用位数组来表示各元素是否出现,每个元素对应一位,所需的总内存为n bit。能大大减少内存占用且位操作迅速。
如果要统计1亿个数据的基数值,大约需要内存100000000/8/1024/1024 ≈ 12M,内存减少占用的效果显著。然而统计一个对象的基数值需要12M,如果统计10000个对象,就需要将近120G,同样不能广泛用于大数据场景。
4、概率算法
- Linear Counting(LC):早期的基数估计算法,LC在空间复杂度方面并不算优秀,实际上LC的空间复杂度与上文中简单bitmap方法是一样的(但是有个常数项级别的降低),都是O(Nmax);
- LogLog Counting(LLC):LogLog Counting相比于LC更加节省内存,空间复杂度只有O(log2(log2(Nmax)));
- HyperLogLog Counting(HLL):HyperLogLog Counting是基于LLC的优化和改进,在同样空间复杂度情况下,能够比LLC的基数估计误差更小。
2、HyperLogLog
原理:
参考资料
2、原始论文:Loglog Counting of Large Cardinalities
基数计数——HyperLogLog的更多相关文章
- 【原创】大叔算法分享(4)Cardinality Estimate 基数计数概率算法
读过<编程珠玑>(<Programming Pearls>)的人应该还对开篇的Case记忆犹新,大概的场景是: 作者的一位在电话公司工作的朋友想要统计一段时间内不同的电话号码的 ...
- 基数估算HyperLogLog
HyperLogLog HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值: • 基数:集合中不同元素的数量.比如 {'apple', 'banana', 'cherry', ...
- 华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数
摘要:高斯Redis,计数的最佳选择! 一.背景 当我们打开手机刷微博时,就要开始和各种各样的计数器打交道了.我们注册一个帐号后,微博就会给我们记录一组数据:关注数.粉丝数.动态数-:我们刷帖时,关注 ...
- Redis系列10:HyperLogLog实现海量数据基数统计
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- 解读Cardinality Estimation<基数估计>算法(第一部分:基本概念)
基数计数(cardinality counting)是实际应用中一种常见的计算场景,在数据分析.网络监控及数据库优化等领域都有相关需求.精确的基数计数算法由于种种原因,在面对大数据场景时往往力不从心, ...
- HyperLogLog算法
项目在统计UV/PV时用到了Druid的Hyper hyperunique算法,书上介绍这种算法求出的UV/PV存在一定误差,因此需要了解下误差来自哪里. 实现去重功能,最简单的就是使用set记录集合 ...
- redis常用数据类型 HyperLoglog
1.HyperLoglog简介 HyperLoglog是redis新支持的两种类型中的另外一种(上一种是位图类型Bitmaps).主要适用场景是海量数据的计算.特点是速度快.占用空间小. 同样是用于计 ...
- Redis HyperLogLog用法简介
(1)HyperLogLog简介 在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 ...
- Reids(4)——神奇的HyperLoglog解决统计问题
一.HyperLogLog 简介 HyperLogLog 是最早由 Flajolet 及其同事在 2007 年提出的一种 估算基数的近似最优算法.但跟原版论文不同的是,好像很多书包括 Redis 作者 ...
随机推荐
- 第二章 STM32的结构和组成
2.5 芯片里面有什么 STM32F103采用的是Cortex-M3内核,内核即CPU,由ARM公司设计. ARM公司并不生产芯片,而是出售其芯片技术授权. 芯片生产厂商(SOC)如ST.TI.Fre ...
- [SP10628]Count on a tree
Description: 给定一颗n个点的树,有m个询问,求任意两点路径上点权第k小的点 Hint: \(n,m<=1e5\) Solution: 比较水 以每个点到根节点的数的前缀和建主席树 ...
- C#数组,ArrayList,List
一.数组声明方式 1,声明一个未经初始化的数组引用,以后可以把这引用初使化为一个数组实例 int[] int_array; int_array = new int[2]; 注:数组的引用必须以相同或相 ...
- vs 基本验证控件使用
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.c ...
- JSP(8)—EL案例和JSTL案例
1.EL案例 el.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- .Net转Java.06.字符串的split的区别
在Java遇到了将类似“1|2|3|4”的字符串分隔为数组的功能 这种问题能难倒有着十多年开发经验的的.NET码农? // Java代码 String s="1|2|3"; Str ...
- sql server ExecuteNonQuery()返回受影响行数不适用select语句
SqlCommand.ExecuteNonQuery 方法对连接执行 Transact-SQL 语句并返回受影响的行数. 对于 UPDATE.INSERT 和 DELETE 语句,返回值为该命令所影响 ...
- Jetpack 架构组件 Room 数据库 ORM MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 小白入门使用Nginx基础的常用操作
nginx启动,重启,关闭命令 停止操作 停止操作前需要ps当前Nginx的所有进程 步骤1:查询nginx主进程号 ps -ef | grep nginx 在进程列表里 面找master进程,它的编 ...
- Windows 7安装Tensorflow
以前是在Cent OS中运行Tensorflow,,经常需要切换操作系统,很不方便,于是决定在Windows 7下安装Tensorflow. 过程还是挺复杂的,需要安装的包括:Visual Studi ...