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章 大数据概述 单元测验 1.[单选题]第三次信息化浪潮的标志是: A.个人电脑的普及 B.互联网的普及 C.云计算.大数据.物联网技 ...

  2. 大数据技术原理与应用课后题(林子雨)

    大数据技术原理与应用(林子雨) 第1章 大数据概述 1单选(2分) 第三次信息化浪潮的标志是: A.个人电脑的普及 B.云计算.大数据.物联网技术的普及 C.虚拟现实技术的普及 D.互联网的普及 正确 ...

  3. 大数据技术原理与应用 第一篇 大数据基础

    目录 第一章 大数据概述 一. 大数据时代 1.1 三次信息化浪潮 1.2 信息科技发展 1.3 数据产生方式的变革 1.4 大数据的影响 二. 大数据的概念 2.1 大数据的特征 2.2 大数据关键 ...

  4. 林子雨试卷《大数据技术原理与应用》试题与答案

    <大数据技术原理与应用>试题与答案 问答题(100分): (问答题,共13道题目,第1题4分,第2题6分,第3题10分,第4题10分,第5题16分,第6题6分,第7题12分,第8题6分,第 ...

  5. 关于大数据技术原理与应用的学习(3)

    学习目标: 大数据技术原理与应用 学习内容: 分布式文件系统HDFS 3.1HDFS简介 3.2HDFS相关概念 3.3HTFS体系结构 3.4HTFS存储元原理 3.5HDFS数据读写 3.6HDF ...

  6. 大数据技术原理与应用作业七

    大数据技术原理与应用作业七 1. 试述MapReduce和Hadoop的关系. Google公司最先提出了分布式并行编程模型MapRedece,Hadoop MapReduce是它的开源实现.Goog ...

  7. 大数据技术原理与应用作业一

    大数据技术原理与应用作业一 1.试述信息技术发展史上的3次信息化浪潮及其具体内容. ​ 第一次信息化浪潮发生在1980年前后,具体标志是个人计算机的出现,PC开始普及,使得计算机走入企业和千家万户,大 ...

  8. 大数据技术原理与应用作业十

    大数据技术原理与应用作业十 1. 试述流数据的概念. 流数据,即数据以大量.快速.时变的流形式持续到达. 2. 试述流数据的特点. 流数据具有如下特征: 数据快速持续到达,潜在大小也许是无穷无尽的 数 ...

  9. 大数据技术原理与应用——NoSQL数据库

    大数据技术原理与应用--NoSQL数据库 5.1 NoSQL 简介 特点 1.灵活的可扩展性 传统的关系型数据库由于自身设计机理的原因,通常很难实现"横向扩展",在面对数据库负载大 ...

最新文章

  1. 【论文解读】IPM2020 | 长短期兴趣建模的图神经网络新闻推荐系统
  2. iOS之深入解析类Class的底层原理
  3. 建德有没有计算机培训,建德计算机培训,建德计算机培训班,建德计算机培训完好找工作吗 - IT教育频道...
  4. 开源GIS库GDAL/GEOS在Windows下的编译与 Codeblocks配置
  5. error: default argument given for parameter 4
  6. lenneth -- 基于koa2 的web极简框架
  7. 蓝桥杯题目——平方回文数
  8. 二叉树遍历之先序遍历算法(非递归、递归)入门详解
  9. Premiere Pro CC2018 软件安装包+安装教程
  10. 实验中常用光纤接头型号
  11. 动画练习-360度旋转-animation
  12. wdcp服务器权限修改,Linux下wdcp控制面板安装tipask3.0教程
  13. mysql中常用动词_mysql常用sql语句总结
  14. SQL基础培训13-索引和优化
  15. 徐家骏:华为十年感悟(转载)
  16. 红队作业 | 收集xxx.com域名的所有子域名
  17. linux中无线管理员密码,无线网管理员密码
  18. 事业单位考软考中级该考哪一个?
  19. 多功能数字钟c语言单片机PPT,基于STC89C52单片机的多功能数字钟的设计
  20. 红米手机使用应用沙盒动态修改位置数据

热门文章

  1. 笨方法学python 习题32-33
  2. Linux7.0下UNbound搭建DNS服务器
  3. STC单片机获取红外解码从串口输出
  4. Python入门程序
  5. Modbus编程实践
  6. UCOSIII任务调度和任务切换
  7. 人工智能与神经生理学:差异为何重要
  8. 图片验证码和短信验证码开发
  9. JEECG容器化部署
  10. 详解Vue中使用scope进行样式隔离