基本上是hash实用的各种举例

  1. 布隆过滤器 Bloom Filter

    常用来检测某个原色是否是巨量数据集合中的成员,优势是节省空间,不会有漏判(已经存在的数据肯定能够查找到),缺点是有误判(不存在的数据可能也会被找到)。

    应用场景有,chrome进行恶意的url判断,爬虫判断爬取过的url,缓存使用BF进行海量数据查找,比特币使用BF对历史交易进行验证。

    基本思想是,首先有个位数组,长度为m,将数据a通过n个hash函数进行计算,每个hash得到的结果x 在[1,m]区间,将x作为一个索引,索引到位数组的x位置并置1,这样数据a就会将位数组中的n个位置置1,对a的存在与否的查询,就通过判断a hash后所有位置的1是否存在,来进行判断

    因为只需要位数组来进行数据的映射存储,所以BF的空间利用率是很高的,但是很明显,这种方法会有误判率,如果a和b进行hash后设置的bit 1正好覆盖了数据c的hash后的bit 1的位置,则会误判c也存在。所以基本的BF算法是不适合对误判率要求较高的情况,另外一个优点是BF不会有漏判......

    那么影响误判率的因素有哪些呢?数据集合越大,自然设置的bit 1 会越多,误判率会越高;位数组的长度越大,bit 1 重复的可能越小,误判率越低;hash函数个数对误判率的影响,分两头说,映射的写bit过程,hash函数越多,越多的bit会被置1,导致误判率越高,查询时,哈希函数越多,误判率越低。书中提供了一个经过数学分析的公式,我们要做的,就是灵活的使用公式,根据实际情况来决定,在误判率和数据预估的情况下,如何设计hash函数和位数组。

计数BF:

基本的BF是无法删除映射关系的,因为一旦删除某数据对应的所有bit 1,可能影响到其他映射到同样bit的数据。解决方案是bit不仅置1,还进行一个置1的计数。

  2. skip list

      一般而言,列表的查找是耗时的,因为要一个接一个的查找,而skip list可以解决这个问题,redis就用到了skip list提高了查找效率

总体而言,skip list是将list进行了分层,数据可能同时在多层的列表中,而数据的查找,可以在各层之间进行,这样就是跳跃着查找,而不是挨个的查找。

数据的插入,在找到位置后,会通过随机数进行新节点的层数生成,然后加入整体的skip list,更新每一层的指针。

3. Merkle 哈希树

Merkle树主要用来在海量数据下定位少量变化的数据内容。

树如下,root的hash值会由CDEF四个数据块的hash值得到,所以有一个数据有变化,导致根节点的hash变化,然后就向子节点查询,最终快速找到是C D E F 哪个子节点变化了。

4 snappy与LZSS算法

这里说的是压缩和解压算法。

词典编码,即用一个词典中的号码来代替文本中的词,实现压缩。而这个词典可以预设,即静态词典,或者动态生成,LZSS就是动态词典编码。

比如abcdxabcm,动态词典由已经编码的文本导出生成,当编码abcdx后,到abcm,发现abc在动态词典中存在,于是这个abc就可以压缩输出,达到压缩目的。可见,如果要提高压缩效率,可以对查询字典额字符做合理的最小匹配长度限制,如果上面例子的最小匹配长度为4,那么上面提到的abc就不会压缩了。

同时,如何找到最长匹配的字符串也是影响效率的关键点之一,我们可以将各种长度片段存入hash表,就可以实现最快的匹配。

snappy基本上遵循lz算法,它规定最小匹配长度为4,同时将整个数据分割32kb,独立压缩,这样2个字节可以匹配字符串的相对位置

5 cuckoo hashing

这种hash可以很好的解决hash冲突,提高了hash的查找效率

插入一个数据x,将其进行2个不同的hash,得到2个hash桶的索引,如果有任意一个为空,则插入,如果都不为空,则踢出当前数据,然后插入x,被踢出的数据重复上述操作,如果一直有被踢出的数据,则设定最大替换次数,当到达最大,要么增加桶,要么重新选择合适的hash函数来替换之前的函数。

这种方式下,查找变成O(1)的复杂度,因为只要查2个位置即可。

这种hash的一般变体,是增加hash函数的个数或者让每个桶存储多个数据,可以提高hash空间的桶里用来过滤

    

二. 大数据常用的算法和数据结构 <<大数据日知录>> 读书笔记的更多相关文章

  1. 一. 数据分片和路由 <<大数据日知录>> 读书笔记

    本章主要讲解大数据下如何做数据分片,所谓分片,即将大量数据分散在不同的节点,同时每个存储节点还要做副本备份. 而一般的抽象分片方法是, 先将数据映射到一个分片空间,这是多对一的关系,即一个数据分片区间 ...

  2. 《大数据日知录》读书笔记-ch3大数据常用的算法与数据结构

    布隆过滤器(bloom filter,BF): 二进制向量数据结构,时空效率很好,尤其是空间效率极高.作用:检测某个元素在某个巨量集合中存在. 构造: 查询: 不会发生漏判(false negativ ...

  3. 读&lt;大数据日知录:架构与算法&gt;有感

    前一段时间, 一个老师建议我能够学学 '大数据' 和 '机器学习', 他说这必定是今后的热点, 学会了, 你就是香饽饽.在此之前, 我对大数据, 机器学习并没有非常深的认识, 总觉得它们是那么的缥缈, ...

  4. 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)

    Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...

  5. 《神经网络算法与实现-基于Java语言》的读书笔记

    文章提纲 全书总评 读书笔记 C1.初识神经网络 C2.神经网络是如何学习的 C3.有监督学习(运用感知机) C4.无监督学习(自组织映射) Rreferences(参考文献) 全书总评 书本印刷质量 ...

  6. 存储器的保护(二)——《x86汇编语言:从实模式到保护模式》读书笔记19

    接着上一篇博文说. 5.代码段执行时的保护 每个代码段都有自己的段界限.同栈段一个道理,有效界限和G位相关. G=0:有效界限 = 描述符中的段界限 G=1:有效界限 = 描述符中的段界限值 * 0x ...

  7. 硬盘和显卡的访问与控制(二)——《x86汇编语言:从实模式到保护模式》读书笔记02

    上一篇博文我们讲了如何看到实验结果,这篇博文我们着重分析源代码. 书中作者为了说明原理,约定了一种比较简单地用户程序头部格式,示意图如下(我参考原书图8-15绘制的,左边的数字表示偏移地址): 所以, ...

  8. 进入保护模式(二)——《x86汇编语言:从实模式到保护模式》读书笔记14

    首先来段题外话:之前我发现我贴出的代码都没有行号,给讲解带来不便.所以从现在起,我要给代码加上行号.我写博客用的这个插入代码的插件,确实不支持自动插入行号.我真的没有找到什么好方法,无奈之下,只能按照 ...

  9. 《大数据日知录》读书笔记-ch16机器学习:分布式算法

    计算广告:逻辑回归 千次展示收益eCPM(Effective Cost Per Mille) eCPM= CTR * BidPrice 优化算法 训练数据使用:在线学习(online learning ...

随机推荐

  1. python报错: invalid syntax

    invalid syntax: 无效的语法. 解决办法:查看当前语句中的  , 如果当前行没找到错误,依次往上找,往上找时可以利用是否有输出进行快速查找. 原因:python语法很严格,少了左括号.右 ...

  2. Core 定时任务之HangFire

    ASP.NET Core 使用 Hangfire 很简单,首先,Nuget 安装程序包 > install-package Hangfire -pre 然后ConfigureServices添加 ...

  3. 如何通过Java8的方式去统计程序执行时间?

    代码如下所示 import java.time.Duration; import java.time.Instant; import java.util.concurrent.TimeUnit; pu ...

  4. 图解 Kubernetes

    容器 在了解 Kubernetes 之前,让我们先了解一个容器. 因为如果不了解容器就没法聊容器编排. 容器就是...一个你塞入所有材料的容器. "材料"是指你的应用代码.依赖库, ...

  5. Drupal SA-CORE-2019-010 .开头文件名(如.htaccess) 文件上传

    目录 drupal .开头文件名 文件上传 原生模块分析 第三方模块分析 补丁 参考 drupal .开头文件名 文件上传 通过diff 8.8.1的补丁,很容易发现修复点,位于core\module ...

  6. 如何取消chrome的自动翻译

    设置中搜索“翻译” 然后关掉“询问是否翻译非您所用语言的网页”的选项即可 需要翻译的时候在目标网页右键“翻译成中文”即可 用github的时候烦的要死,翻译的贼不准.

  7. ios---运用MJRefresh组件设置下拉刷新

    #import "XMGTopicViewController.h" #import <AFNetworking.h> #import <MJExtension. ...

  8. Python中__init__的用法和理解

    在Python中定义类经常会用到__init__函数(方法),首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问.而__init__函数(方法)支持带参数类的初始化, ...

  9. 提醒你一下, 你真的很垃圾, 创建一个maven 的web 项目都忘记了

    1. 创建项目 2. 选择maven 项目 3  然后选择创建 web 项目的模板  (结尾是webapp 的) 4. 选择自己的maven 的配置文件 setting.xml  以及自己的maven ...

  10. 两张导图带你走进Spring设计模式与编程思想

    两张思维导图带你了解Spring Spring常用设计模式 Spring设计思想