大数据计数原理1+0=1这你都不会算(一)No.47
hello哈,大家是不是好久没见到我啦?我也是一直在摸索小伙伴们喜欢看到什么东西,不喜欢看什么东西,还请大家多多支持。为了表示感谢。小蕉在这给你们一鞠躬,二鞠躬,三。事不过三~
1+0=1你都不会谈什么大数据?
这篇呢,又是开坑之作,这是一个系列,主要会将大数据下的计数原理。说到计数,不知道大家会第一印象想到什么,我估计会是。。数手指。。没错,小蕉从小学开始就开始数手指,所有20以内的加减法很早就掌握了。研表究明,这估计也是我们现在使用十进制的原因,如果我们每个人每只手都有6只手指,那我们可能就用十二进制了。
好了不扯了,那用程序怎么计数呢?要去重那种。按照我拍脑袋设想呢,第一印象,嗯用HastSet准没错,但是HashSet占用的内存有多少你们知道吗?可以装下我一年的米饭。内存占用太大,所以就有了后面的B-tree,Bitmap,Bloom Filter,Linear Counting,LogLog Counting,Adaptive Counting,HyperLogLog Counting,HyperLogLog++ Counting。
如果现在你们一个都听不懂的话,那就对了,但那也木有关系,我会一个一个跟你们讲清楚哒。(如果我不断更的话,嗯)
那第一篇就开始讲HashSet是怎么进行计数的吧。首先我们看一下HashSet的底层结构是什么。
from HashSet
private transient HashMap<E,Object> map;
public HashSet() { map = new HashMap<E,Object>();}
唔,咩你甘噶。想不到你是这样的HashSet,底层居然是一个私有的无法序列化的HashMap,黑人问号脸。计数嘛,我们就会想知道,集合中有没有存在过这个数字,那HashSet是怎么知道它自己的集合中有没有存在某个值的呢?
from HashSet
public boolean contains(Object o) { return map.containsKey(o);}
oh,原来是直接调用了HashMap的containsKey这个方法,那HashMap又是怎么找的呢?
from HashMap
final Entry<K,V> getEntry(Object key) {int hash = (key == null) ? 0 : hash(key.hashCode());for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k;if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))return e; }return null;}
看不懂也没关系我讲给你听。首先算一下key的hash值,然后在自己的HashEntry的数组里面(其实就是一个元素都是链表的数组,哎呀好拗口),找到对应的HashEntry,找到之后呢,再根据链表一个一个找,如果发现key的hash值,引用,或者equals完全相等,嗯没错,那这个key就已经存在在HashSet中啦。这时候计数就不用+1了。
那如果一个值不存在呢?那就计数+1,顺便把自己放到集合里边嘛~怎么放呢?程序员有一句黑话叫,"don't bb,show me the code"。
from HashSet
private static final Object PRESENT = new Object();
public boolean add(E e) { return map.put(e, PRESENT)==null;}
由此可见,也只是调用了HashMap的put方法,还特么把一个叫PRESENT的不知道什么鬼的静态的私有的无法修改的Object当成value值了。oh好像这样也可以理解,我们只是需要借助HashMap的key就知道重不重复了。至于HashMap是怎么put一个值得呢?
from HashMap
public V put(K key, V value) {if (key == null)return putForNullKey(value);int hash = hash(key.hashCode());int i = indexFor(hash, table.length);for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this);return oldValue; } } modCount++; addEntry(hash, key, value, i);return null;}
好这一堆基本都不用看,就看那个addEntry就够了,上面一大坨大概的意思就是,如果key已经存在了,那就覆盖原有的value值,然后就啥也不干,这不是我们本次的重点(modCount跟线程安全有关感兴趣同学自省度娘)。
from HashMap
void addEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; table[bucketIndex] = new Entry<K,V>(hash, key, value, e);if (size++ >= threshold) resize(2 * table.length); }
这一小段大概的意思呢,就是,把原来HashEntry的数组对应hash位置的值拿出来,然后把现在的值接到最前面去。然后非常关键的代码出现了。
size++
哇哇哇,size++,嗯,计数靠谱了,可以计数了。
from HashSet
public int size() { return map.size();}
from HashMap
public int size() {return size;}
嗯我们可以看到,就是直接把size返回了。
到这里我们已经说完了HashSet的计数原理啦。那么如果有N个值,这个HashSet需要多少空间呢?假设整个HashMap都放满了。
至少需要N*8+PRESENT,还要加上HashEntry的开销,只能说是吃内存大户。
下一次,我们继续聊聊,稍微不太那么占内存的计数方法。
当当当,请叫我挖坑小能手。你的分享转发点赞留言就是对我最大的支持,如果希望这个系列继续下去的话。哇咔咔。话说,弱鸡默默再问一次,有小伙伴想看Google三大论文吗?
赞赏一下,开心一周
大数据计数原理1+0=1这你都不会算(一)No.47相关推荐
- [渝粤教育] 厦门大学 大数据技术原理与应用 参考 资料
教育 -大数据技术原理与应用-章节资料考试资料-厦门大学[] 第1章 大数据概述 单元测验 1.[单选题]第三次信息化浪潮的标志是: A.个人电脑的普及 B.互联网的普及 C.云计算.大数据.物联网技 ...
- 大数据技术原理与应用课后题(林子雨)
大数据技术原理与应用(林子雨) 第1章 大数据概述 1单选(2分) 第三次信息化浪潮的标志是: A.个人电脑的普及 B.云计算.大数据.物联网技术的普及 C.虚拟现实技术的普及 D.互联网的普及 正确 ...
- 大数据技术原理与应用 第一篇 大数据基础
目录 第一章 大数据概述 一. 大数据时代 1.1 三次信息化浪潮 1.2 信息科技发展 1.3 数据产生方式的变革 1.4 大数据的影响 二. 大数据的概念 2.1 大数据的特征 2.2 大数据关键 ...
- 林子雨试卷《大数据技术原理与应用》试题与答案
<大数据技术原理与应用>试题与答案 问答题(100分): (问答题,共13道题目,第1题4分,第2题6分,第3题10分,第4题10分,第5题16分,第6题6分,第7题12分,第8题6分,第 ...
- 关于大数据技术原理与应用的学习(3)
学习目标: 大数据技术原理与应用 学习内容: 分布式文件系统HDFS 3.1HDFS简介 3.2HDFS相关概念 3.3HTFS体系结构 3.4HTFS存储元原理 3.5HDFS数据读写 3.6HDF ...
- 大数据技术原理与应用作业七
大数据技术原理与应用作业七 1. 试述MapReduce和Hadoop的关系. Google公司最先提出了分布式并行编程模型MapRedece,Hadoop MapReduce是它的开源实现.Goog ...
- 大数据技术原理与应用作业一
大数据技术原理与应用作业一 1.试述信息技术发展史上的3次信息化浪潮及其具体内容. 第一次信息化浪潮发生在1980年前后,具体标志是个人计算机的出现,PC开始普及,使得计算机走入企业和千家万户,大 ...
- 大数据技术原理与应用作业十
大数据技术原理与应用作业十 1. 试述流数据的概念. 流数据,即数据以大量.快速.时变的流形式持续到达. 2. 试述流数据的特点. 流数据具有如下特征: 数据快速持续到达,潜在大小也许是无穷无尽的 数 ...
- 大数据技术原理与应用——NoSQL数据库
大数据技术原理与应用--NoSQL数据库 5.1 NoSQL 简介 特点 1.灵活的可扩展性 传统的关系型数据库由于自身设计机理的原因,通常很难实现"横向扩展",在面对数据库负载大 ...
最新文章
- 【论文解读】IPM2020 | 长短期兴趣建模的图神经网络新闻推荐系统
- iOS之深入解析类Class的底层原理
- 建德有没有计算机培训,建德计算机培训,建德计算机培训班,建德计算机培训完好找工作吗 - IT教育频道...
- 开源GIS库GDAL/GEOS在Windows下的编译与 Codeblocks配置
- error: default argument given for parameter 4
- lenneth -- 基于koa2 的web极简框架
- 蓝桥杯题目——平方回文数
- 二叉树遍历之先序遍历算法(非递归、递归)入门详解
- Premiere Pro CC2018 软件安装包+安装教程
- 实验中常用光纤接头型号
- 动画练习-360度旋转-animation
- wdcp服务器权限修改,Linux下wdcp控制面板安装tipask3.0教程
- mysql中常用动词_mysql常用sql语句总结
- SQL基础培训13-索引和优化
- 徐家骏:华为十年感悟(转载)
- 红队作业 | 收集xxx.com域名的所有子域名
- linux中无线管理员密码,无线网管理员密码
- 事业单位考软考中级该考哪一个?
- 多功能数字钟c语言单片机PPT,基于STC89C52单片机的多功能数字钟的设计
- 红米手机使用应用沙盒动态修改位置数据