二. 大数据常用的算法和数据结构 <<大数据日知录>> 读书笔记
基本上是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 ...
随机推荐
- APICloud开发者进阶之路 |audioRecorder录音模块Demo
本文出自APICloud官方论坛 audioRecorder 模块通过封装系统的录音接口,能够快速的为开发者提供一个完整的录音功能. 该模块提供Android和iOS版本,录音方式及录制的音频格式 ...
- dp - 求符合题意的序列的个数
The sequence of integers a1,a2,…,ak is called a good array if a1=k−1 and a1>0. For example, the s ...
- Python解析json字符串,json字符串用法
json数据简介 json数据是一个轻量级的数据交换格式,采用完全独立于语言的文本格式,这些特性使json称为理想的数据交换语言,易于人阅读和编写,同时易于机器解析和生成. json中的字符集必须是U ...
- 临近年关,修复ASPNETCore因浏览器内核版本引发的单点登陆故障
临近年关,咨询师提出360,搜狗急速浏览器无法单点登陆到公司核心产品WD, 报重定向过多. 现象 经过测试, 出现单点登陆故障的是搜狗,360等主打双核(默认Chrome内核)的浏览器, 较新式的Ed ...
- Django自定义状态码
class BaseResponse: def __init__(self): self.code = 1000 self.data = None self.error = None @propert ...
- pymysql 增
1.重点:数据库插入数据需要进行---------事物提交 其它:事物回滚 import pymysql # 注册用户 print("=========注册用户===========&quo ...
- lind 语 api 数据的安全性 第四弹
web api的安全性怎么保证呢. 一般公司会自己封装一套请求的规范. 下面来看看lind语里的webapi安全规范 step one 先看下 diagram: 学而思: 从上面的图分析一下: 如果我 ...
- ASP.NET Core下Ocelot的简单使用
一.创建demo项目 1.新建webapi项目,命名为“DemoProject”,去掉HTTPS勾选 using Microsoft.AspNetCore.Mvc; using System.Coll ...
- LeetCode-指针法
LeetCode刷题总结-指针法 方法介绍:指针法主要使用在一组按从小到大排好序的数组中,当按照条件查找对应元素时,在数组的前后定义两个指针,当两个指针代表的元素进行运算时:若结果大于目标值,则左移右 ...
- Cassandra2.2.10安装过程
1. 2.安装JVM 3.OS环境配置: 关闭防火墙:service iptables stop vi /etc/sysctl.conf vm.zone_reclaim_mode=0 vm.max_m ...