二. 大数据常用的算法和数据结构 <<大数据日知录>> 读书笔记
基本上是hash实用的各种举例
- 布隆过滤器 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空间的桶里用来过滤
二. 大数据常用的算法和数据结构 <<大数据日知录>> 读书笔记的更多相关文章
- 一. 数据分片和路由 <<大数据日知录>> 读书笔记
本章主要讲解大数据下如何做数据分片,所谓分片,即将大量数据分散在不同的节点,同时每个存储节点还要做副本备份. 而一般的抽象分片方法是, 先将数据映射到一个分片空间,这是多对一的关系,即一个数据分片区间 ...
- 《大数据日知录》读书笔记-ch3大数据常用的算法与数据结构
布隆过滤器(bloom filter,BF): 二进制向量数据结构,时空效率很好,尤其是空间效率极高.作用:检测某个元素在某个巨量集合中存在. 构造: 查询: 不会发生漏判(false negativ ...
- 读<大数据日知录:架构与算法>有感
前一段时间, 一个老师建议我能够学学 '大数据' 和 '机器学习', 他说这必定是今后的热点, 学会了, 你就是香饽饽.在此之前, 我对大数据, 机器学习并没有非常深的认识, 总觉得它们是那么的缥缈, ...
- 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)
Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...
- 《神经网络算法与实现-基于Java语言》的读书笔记
文章提纲 全书总评 读书笔记 C1.初识神经网络 C2.神经网络是如何学习的 C3.有监督学习(运用感知机) C4.无监督学习(自组织映射) Rreferences(参考文献) 全书总评 书本印刷质量 ...
- 存储器的保护(二)——《x86汇编语言:从实模式到保护模式》读书笔记19
接着上一篇博文说. 5.代码段执行时的保护 每个代码段都有自己的段界限.同栈段一个道理,有效界限和G位相关. G=0:有效界限 = 描述符中的段界限 G=1:有效界限 = 描述符中的段界限值 * 0x ...
- 硬盘和显卡的访问与控制(二)——《x86汇编语言:从实模式到保护模式》读书笔记02
上一篇博文我们讲了如何看到实验结果,这篇博文我们着重分析源代码. 书中作者为了说明原理,约定了一种比较简单地用户程序头部格式,示意图如下(我参考原书图8-15绘制的,左边的数字表示偏移地址): 所以, ...
- 进入保护模式(二)——《x86汇编语言:从实模式到保护模式》读书笔记14
首先来段题外话:之前我发现我贴出的代码都没有行号,给讲解带来不便.所以从现在起,我要给代码加上行号.我写博客用的这个插入代码的插件,确实不支持自动插入行号.我真的没有找到什么好方法,无奈之下,只能按照 ...
- 《大数据日知录》读书笔记-ch16机器学习:分布式算法
计算广告:逻辑回归 千次展示收益eCPM(Effective Cost Per Mille) eCPM= CTR * BidPrice 优化算法 训练数据使用:在线学习(online learning ...
随机推荐
- AWS、阿里云、Azure、Google Cloud、华为云、腾讯云 各种云服务器价格收费对比(上)
他来了,他来了~ 他带着六家公有云厂商的资源价格走来了~ 不久前,我们上线了一款小工具——[多云成本计算器]1.0版,公众号菜单栏可以直接体验.详细介绍可以戳这里<3秒即得最低价,速石上线「多云 ...
- MySQL/数据库 知识点总结
书籍推荐 <SQL基础教程(第2版)> (入门级) <高性能MySQL : 第3版> (进阶) 文字教程推荐 SQL Tutorial (SQL语句学习,英文).SQL Tut ...
- max count混合使用
SELECT MAX(a1.人数) FROM (SELECT COUNT(category_id) AS "人数",category_id FROM course_category ...
- Java 集合源代码——ArrayList
(1)可以查看大佬们的 详细源码解析 : 连接地址为 : https://blog.csdn.net/zhumingyuan111/article/details/78884746 (2) Array ...
- 搞定SpringBoot多数据源(3):参数化变更源
目录 1. 引言 2. 参数化变更源说明 2.1 解决思路 2.2 流程说明 3. 实现参数化变更源 3.1 改造动态数据源 3.1.1 动态数据源添加功能 3.1.2 动态数据源配置 3.2 添加数 ...
- http请求头中的content-type属性
在HTTP请求中,我们每天都在使用Content-Type来指定不同格式的请求信息,但是却很少有人去全面了解Content-Type中允许的值有多少,因此这里来了解一下Content-Type的可用值 ...
- PHP——foreach
一.foreach 在PHP中foreach循环语句,常用于遍历数组,一般有两种使用方式:不取下标.取下标 (一)只取值,不取下标 <?php foreach (数组 as 值){ //执行的任 ...
- python 获取网页图片 十月底的 一弹
#!/usr/bin/pythonimport reimport urllib def getHtml(url): page=urllib.urlopen(url) html=page.r ...
- 夜晚 暴力 十点钟 jQuery 的 extend 实现 原理
jQuery 的 extend 是怎么实现的 一看代码 喉咙 就不爽 这是 jQuery JavaScript Library v1.6 一看代码 多的 屁股疼 , 排名 前三 的 文章 可以去参考下 ...
- 在ubuntu18.04下搭建kvm
前一段时间一直在尝试Ubuntu上搭建xen,一直出现各种问题,各种坑 首先先感谢下面这个公司对我的耐心解答,非常感谢.特别是后面来的电话对我进行了详细的解答,所以选择搭建kvm. 1. 需要检查一下 ...