知识点整理:大数据场景

1. 十个大数据量处理方法总结

1.1 Bloom filter(布隆过滤器)

推荐阅读:详解布隆过滤器的原理,使用场景和注意事项

适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集

基本原理及要点:位数组 + k 个独立的 hash 函数,插入时,将 hash 函数对应的位变成1。查找时,如果发现所有的 hash 函数对应位都是1,则说明有可能存在(有错误率),但如果发现有对应位上为0,则说明一定不存在。

问题实例

1)给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。

如果允许一定的错误率,则可以将其中一个文件的 url 使用布隆过滤器映射到位数组中,然后挨个读取另一个文件的 url,检查在布隆过滤器中是否出现过。


1.2 Hashing

适用范围:快速查找、删除的基本数据结构,通常需要 key 的总数据量可以放入内存

基本原理及要点

hash 函数选择,针对字符串、整数等对象有对应的 hash 方法。

碰撞处理,一种是拉链法,一种是开地址法。

扩展

d-left hashing 中的 d 是多个的意思,我们先简化这个问题,看一看 2-left hashing。

2-left hashing 指的是将一个哈希表分成长度相等的两半,分别叫做 T1 和 T2,给 T1 和 T2 分别配备一个哈希函数,h1 和 h2。在存储一个新的 key 时,同时用两个哈希函数进行计算,得出两个地址 h1(key) 和 h2(key)。这时需要检查 T1 中 h1(key) 的位置和 T2 中 h2(key) 的位置,哪一个位置已经存储的 key 比较多,然后将新 key 存储在负载小的位置。如果两边一样多,那就存储在 T1 中。

问题实例

1)对于海量日志数据,提取出某日访问百度次数最多的那个 IP。

由于 IP 的数目是有限的,最多 2^32 ,所以可以考虑使用 hash 将 IP 直接存入内存中的 hash 表,然后进行统计。


1.3 bit-map

适用范围:可以进行数据的快速查找、判重、删除,一般来说数据范围是 int 的10倍以下

基本原理及要点:使用 bit 数组来表示某些元素是否存在,比如8位电话号码。

扩展:bloom filter 可以看作是 bit-map 的扩展。bit-map 可以用作计数排序。

问题实例

1)已知某个文件内包含一些电话号码,每个号码为8为数字,统计不同号码的个数。

8位范围是 00000000 ~ 99999999,需要100M个 bit,大概只需要十几 MB 的内存即可。

2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将 bit-map 扩展一下,用 2 bit 表示一个数即可,00表示未出现,01表示出现一次,10表示出现2次及以上。


1.4 堆

适用范围:海量数据找 top n,并且 n 比较小,堆可以放入内存

基本原理及要点:最大堆求前 n 小,最小堆求前 n 大。

扩展:双堆,一个最大堆和一个最小堆结合,可以用来维护中位数。

问题实例

1)100w个数找最大的前100个数

用一个大小为100的最小堆即可。


1.5 双层桶划分

本质上就是 分而治之 的思想,重在分的技巧上。

适用范围:第 k 大,中位数,不重复或重复的数字

基本原理及要点:面对一堆大量的数据我们无法处理的时候,我们可以将其分成一个个小的单元,然后根据一定的策略来处理这些小单元,从而达到目的。双层只是一个例子。

问题实例

1)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数

整数的个数是2^32,所以我们可以将这2^32个数划分为2^8个区域(同样的数在同一个区域),然后再将数据分到对应的区域中,然后在不同的区域利用 bit-map 就可以解决了。当然这题也可以直接用 bit-map。

2)5亿个 int 找它们的中位数

首先将 int 划分为 2^16 个区域,将数据分到对应的区域中,然后统计落到各个区域里的数据个数,之后我们根据统计结果就可以判断中位数落到哪个区域,同时知道这个区域中的第几大数刚好是中位数。接着第二次扫描,我们只统计落在这个区域中的那些数就可以了。


1.6 数据库索引

适用范围:大数据量的增删改查

基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。


1.7 倒排索引(Inverted Index)

适用范围:搜索引擎,关键字查询

基本原理及要点:建立关键词到文件 ID 的映射,每个关键词都对应着一系列文件,这些文件中都出现这个关键词,从而可以根据关键词去找文档。

在这里插入图片描述

问题实例

文档检索系统、查询哪些文件包含了某单词,比如常见的学术论文的关键词搜索。


1.8 外排序

适用范围:大数据的排序、去重

基本原理及要点:外排序的归并方法,置换选择败者树原理,最优归并树

问题实例

1)有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。

词的大小为16B,内存只有1M,且要求的是 频数最高。bit-map 通常用于查找和判重,堆通常用于 top k(最大或最小),因此本题只能适用外排序,将内存当做缓冲区使用。


1.9 trie 树(前缀树、字典树)

概念:例如有and,as,at,cn,com这些关键词,可以构造下面的 trie 树:

在这里插入图片描述

适用范围:数据量大,但是重复多,数据种类小,可以放入内存。常用于字符串检索、字符串排序、词频统计。

基本原理及要点:实现方式,节点孩子的表示方式

问题实例

1)有10个文件,每个文件1G,每个文件的每一行都存放的是用户的 query,每个文件的 query 都可能重复。要你按照 query 的频度排序。

词频统计,修改 trie 树的节点结构,使其记录每个 query 的出现频度。

2)1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?

遍历所有字符串,每次在将字符串插入到 trie 树之前,判断能否在 trie 中匹配到重复字符串,如果出现重复,则不插入,否则插入 trie 树。

3)寻找热门查询:查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。

词频统计,修改 trie 树的节点结构,使其记录每个字符串的出现频度。


1.10 分布式处理 MapReduce

适用范围:数据量大,但是数据种类小,可以放入内存

基本原理及要点:将数据交给不同的机器去处理,汇总最后的结果

问题实例

1)海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。

2)一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数的中数(median)?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值