故事:坐在我隔壁的小王问我什么是HyperLogLog
1
最近坐我隔壁的小王同志,心情真是糟透了。不但工作不顺心,被老板狠狠的批了一顿,连女朋友也跟别人跑了(Y 的让你天天在我面前秀)。
真是不可谓不惨,我都快要同情他了。
看着他萎靡又迷离的眼神,我实在不忍心,就劝他请假几天出去散散心。
临走前,我交代他,有什么紧急的事,就联系哥。
还有,不要忘了我们之间的暗号哦 ~
2
于是,小王就拖着疲惫的身躯,背着双肩背包和最新款mac,穿着他最心爱的格子衫出发了。
去哪呢,这是一个问题。平时宅在家里习惯了,想来一场说走就走的旅行还是真不容易呀。
就在小王犯难的时候。
耳机里应时地传来一句歌声:”坐上了火车去拉萨,去看那神奇的布达拉。“
额,那就去布达拉宫吧。参观一下号称世界上海拔最高的建筑,同时感受一下西藏妹子人民的热情。
3
带着对未来的憧憬,踏上旅途的小王,坐在高铁上,听着音乐,很快就进入了梦乡。
梦中他做了一个奇怪的梦,梦到自己不知怎地来到了陌生的世界。
而自己却不知身在何处,身边只有阵阵的风沙跟随。
心道,我这是到哪了,不是应该到布达拉宫了吗。
努力的向远处张望,却怎么也看不真切。
终于睁大眼睛看清了。
却发现,迎面走过来一位乘务员小姐姐,轻启红唇,对小王说,先生到站了,还请赶快准备行李下车了。
4
哦,原来是个梦啊。
心道,这该死的福报,给我搞的都快分不清自己是庄周还是蝴蝶了。
赶紧下了车,跟着大部队,走向布达拉宫的方向。
还没进到布达拉宫里边,小王就感受到了这伟大建筑的雄伟壮观。真是不虚此行啊。
不自觉的就加快了脚步,想一探究竟。
走着走着,小王却发现周围的人一个一个都不见了踪影,只留下自己形单影只。
忽然,眼前一白,再睁开眼,发现自己置身于一片山林之中。
就在小王心觉奇怪时,隐约听到远处传来一阵阵的嬉笑声和水流声。
好奇心驱使下,小王循着声音走去。隔着一片草丛,发现了让他血脉喷张的画面。
一群 x 身 x x 的仙女正在水中戏耍,一个个毫无顾忌的互相嬉闹。姣好的身材一览无余。
就在小王看的入神之际,突然听到一声大喊:谁?!
下一刻就发现他面前站着一个身穿广袖流仙裙的仙女。还未来得及反应,就感觉脑袋一沉,昏睡过去了。。。
5
也不知道过了多长时间,小王感觉好像一个世纪都过去了。睁开眼发现自己正躺在一个类似古代闺房的床上。却发现身体无论如何也是动不了一分。
透过屏风,像是听到有几个女孩子在谈话。
“怎么从来没有见过这样的人,他为什么和我们长的不太一样。“
“他到底是干什么的,为什么可以穿越结界,来到我们女儿国。一般人是做不到的。”
正在讨论间,却发现声音截然而止。然后听到整齐划一的声音,“恭迎女王陛下”。
然后,发现进来了一个仙女,拥有着绝世容颜,毫无瑕疵的脸蛋,美的不可方物。
原来这就是女儿国的国王。
女王毕竟是见过世面的人,知道小王就是传说中的男人。
然后把小王的禁锢给解除了。小王瞬间感觉身上沉重的力量消失了,浑身轻松。
6
(场景切换)
本来小王只请假了一周,但是眼看第二周就要过完了,也没再收到过小王的消息。
我也纳闷,这家伙怎么回事,旅游放松一下就好了,竟然把时间都忘了。
这还有一大堆工作,我帮他兜着呢,再不回来我就报警了啊(无奈)。
。。。
某天深夜,当我正在发奋写文章时,手机突然收到一条消息。
卧槽,这是小王给我发暗号了?
当时,我们约定只有紧急情况下才发暗号,莫非是小王遇到了什么麻烦?
于是,我赶紧对暗号,希望他不要出什么事才好。
随后,小王给我简单叙述了他这一周多的经历。如果不是星哥我经历丰富,差点都被他搞懵逼了。
下面是小王的自述:《《《
那天,我决定去布达拉宫看宫殿,不料,却走到了女儿国的宫殿。
这不要紧,关键是女儿国现在遭遇了一些事情,环境恶化,已经影响到她们的正常生活了。
为了她们的子孙后代,急需一位心地善良,心灵纯洁之人帮助她们化解危机。
其实要做的事情也很简单,就是让我和女儿国的仙女们一起双修就好了。
在女王陛下的一再恳求下,本着助人为乐的精神,我只能留下来帮她们了。
为了更快更效率的完成任务,我记录了这段时间和哪些仙女进行过双修,并把她们进行了编号。
这个好说,因为数据量目前也不大,我决定用 Redis 的 Set 集合来装填数据就可以。
set = {id1,id2,id3}
随着需要我帮助的人越来越多,我发现仙女们各自的体质也稍有不同。因此,每个人和我双修的次数也不固定。
于是,我只能修改记录方式。
用 zset 来分别记录每个人和我双修的次数,
zset = {id1: count1, id2: count2, id3: count3}
后来,仙女数量实在是太多了,以上记录方式已经行不通了,内存会爆掉的。索性我就不算了,何必给自己添麻烦呢。
但是,突然,有天我正在和一个仙女双修呢。女王陛下来到我旁边,看着我辛苦的样子(也或许是我帅气的侧颜)。发现我满脸汗水,于是用那还残留着女王香气的手帕温柔地帮我擦汗。
我能清晰的感觉到女王在我耳边吐气如兰,一双美眸扑闪扑闪地看着我。那细腻光滑、吹弹可破的脸蛋儿,就像刚剥壳的鸡蛋一样。
就在我内心波澜起伏时,女王问我,哥哥,你能估算一下现在大概有多少个仙女双修过了吗。
这下我慌了,这可怎么办呢,我可没有计算这个东东啊。
星哥,江湖救急啊。
》》》
看到这里,我真是气不打一处来,这特么合着我给你顶包,你在外边逍遥快活呢。这真不是人干的事儿啊。
我:你 Y 的,瘦弱的小身板,能经得起折腾吗?
小王: 哎呀,星哥你就不用担心我这个了。我在这天天吃好喝好的,女王还每天给我喝大补汤,我很 OK 的。你赶紧给我解决方案吧。
听到这,我气的打字的双手都在颤抖。单身狗没有人权啊,真是人比人气死人,和小王比,生活真是一个天上一个地下。
生气归生气,但谁让我是好人呢(滴,好人卡),就好事做到底吧。
7
我:那个,你可以用 HyperLogLog 啊,它的键只需要花费 12K 的内存,就可以计算 2^64 个不同元素的基数。这样就大大节省你的内存了。
小王:HyperLogLog 是什么鬼,没听说过啊?还有,你说的基数是什么意思呢?
我: HyperLogLog 是用来做基数统计的一种算法。当输入元素的数量越来越大时,它所占用的空间却是固定的。这是和集合的不同点,集合是元素越多,占用空间越大。
基数很好理解,就比如说有一个数据集存储了每个仙女每次双修的编号 {1, 3, 5, 8, 3, 5, 9},那么去除重复元素后的基数集就是 {1, 3, 5, 8, 9},基数就是它的个数,这里就是 5 ,代表有 5 个仙女和你一起双修过了。
因为你关心的是有多少个仙女和你双修过,不关心具体都是谁。
小王:这个听起来好像很牛批的样子,那我怎么使用呢?
我:你可以使用 pfadd 命令添加元素,命令格式:pfadd key element [element ...]
,例如,我添加三个仙女,pfadd fairy_practice id1 id2 id3
。
当计算基数时,就可以用 pfcount 命令,格式:pfcount key [key ...]
。如果 key 为一个,计算的是这个 HyperLogLog 的近似基数。如果 key 为多个,就可以计算它们的近似基数和。
注意,这里的基数计算是一个估算值,并不是一个准确的值。
HyperLogLog 只会根据输入的元素计算基数,而不会存储元素本身。这是和集合的另外一个不同点,集合会存储每个输入的元素。
所以,你用 pfcount fairy_practice
就满足要求了。因为女王不就让你计算一个大概值吗,而且也没有让你说出仙女的具体名字啊。
小王:卧槽,这个真是太神奇了。星哥你可是帮了我大忙了。等我忙完这阵子,回去就给你带女儿国的特产哈。
我:我去你大 x 的。女儿国能有什么特产,不都是仙女么,你能给我带来几个仙女吗?
小王:。。。(好像不能)
听到这,我真是要被气死了,真是岂有此理,太敷衍我了。
气的我一下子就把电脑给合上了。
天马行空无厘头,vx搜「星哥聊编程」
故事:坐在我隔壁的小王问我什么是HyperLogLog的更多相关文章
- 被缠上了,小王问我怎么在 Spring Boot 中使用 JDBC 连接 MySQL
上次帮小王入了 Spring Boot 的门后,他觉得我这个人和蔼可亲.平易近人,于是隔天小王又微信我说:"二哥,快教教我,怎么在 Spring Boot 项目中使用 JDBC 连接 MyS ...
- 杂谈---小故事小道理,面试中的小技巧(NO.2)
本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...
- 测试小姐姐问我 gRPC 怎么用,我直接把这篇文章甩给了她
原文链接: 测试小姐姐问我 gRPC 怎么用,我直接把这篇文章甩给了她 上篇文章 gRPC,爆赞 直接爆了,内容主要包括:简单的 gRPC 服务,流处理模式,验证器,Token 认证和证书认证. 在多 ...
- LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 计算 24 点是一种扑克牌益智游戏,随机抽出 4 张扑克牌,通过加 (+) ,减 (-) ,乘 ( * ), 除 (/) 四种运算法则计算得到整数 24 ,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写 joker 表示小王,大写 JOKER 表示大王:
include "stdafx.h" #include <iostream> #include <fstream> #include <string& ...
- 手撕redis分布式锁,隔壁张小帅都看懂了!
前言 上一篇老猫和小伙伴们分享了为什么要使用分布式锁以及分布式锁的实现思路原理,目前我们主要采用第三方的组件作为分布式锁的工具.上一篇运用了Mysql中的select ...for update实现了 ...
- 小师妹问 easyUI mergeCells 行合并后表头和内容对不齐
公司来了一个做easyUI的妹子,恰好那妹子是和我一个学校的,有一天下班妹子在超时买东西正好巧遇,然后妹子就问了问题,随便说手机卡需要我帮忙刷机,然后就问手机买了多久, 多少钱,刚买的时候好用不,然后 ...
- 新来的前端小姐姐问:Vue路由history模式刷新页面出现404问题
摘要:vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 本文分享自华为云社区<学习Vue Rou ...
- 架构漫谈系列(2) 封装(Encapsulation)
这是这个系列的第二篇.在第二篇里,我决定讲一讲封装. 程序的不同部分应该用封装去互相隔离,模块之间应该不应该产生很随意的关联. 可能有的人觉得不解,又或觉得是有道理的废话,不急,先一步一步来. 我们先 ...
随机推荐
- Socket、ServerSocket
1.服务器端程序 package demo12.net; import java.io.IOException; import java.io.InputStream; import java.io. ...
- C++动态规划
数塔: #include <iostream> using namespace std; int a[1000][1000]; int main(){ int n; cin>> ...
- c++右值引用和转移构造函数
int &&i = ; //i绑定到了右值1 int b = ; cout << i << endl; //输出1 i = b; cout << i ...
- Python中pytesseract库的使用以及注意事项
当我们在使用pytesseract库的时候,使用 pip install pytesseract安装完成后,发现它并不能识别出图片内容,并且会抛出异常pytesseract.pytesseract.T ...
- Kubernetes使用Eedpoints连接外部服务端口
Kubernetes使用Eedpoints连接外部服务端口 背景: 在Kubernetes的使用环境中,我们经常要连接外部的一些服务,比如mysql Elasticsearch kafka 等等外部的 ...
- 2、Entity Framework Core 3.1入门教程-创建数据库和迁移
本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...
- filebeat 启动失败
最近在ELK架构中启动filebeat时,启动失败,检查启动节点不存在 查看/var/log/message中报错日志,有如下内容 filebeat: Exiting:error loading co ...
- Laravel ServiceProvider注册过程及简单使用
Laravel ServiceProvider注册过程及简单使用 还记得facade注册流程吗?回顾下 在bootstrap/app.php中返回$app实例后,通过singleton方法绑定了三个实 ...
- 使用DataStax Java驱动程序的最佳实践
引言 如果您想开始建立自己的基于Cassandra的Java程序,欢迎! 也许您已经参加过我们精彩的DataStax Academy课程或开发者大会,又或者仔细阅读过Cassandra Java驱动的 ...
- android 申请忽略电池节电
fun checkBattery(){ var main = activity as MainActivity if(main.isIgnoringBatteryOptimizations()){ L ...