2022年2022年教你如何迅速秒杀掉:%的海量数据处理面试题 .pdf
《2022年2022年教你如何迅速秒杀掉:%的海量数据处理面试题 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年教你如何迅速秒杀掉:%的海量数据处理面试题 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、教你如何迅速秒杀掉:99% 的海量数据处理面试题 - 结构之法算法之道 - 博客频道 - CSDN.NEThttp:/ 0:43:33分类:21.Big Data Processing05.MS 100 original教你如何迅速秒杀掉:99%的海量数据处理面试题2012-03-22 12:5129685 人阅读评论 (113)收藏举报教你如何迅速秒杀掉:99% 的海量数据处理面试题作者: July出处:结构之法算法之道blog前言一般而言,标题含有“ 秒杀 ” ,“99% ” ,“ 史上最全 /最强 ” 等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,
2、我也甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章:十道海量数据处理面试题与十个方法大总结的一般抽象性总结。毕竟受文章和理论之限,本文将摒弃绝大部分的细节,只谈方法/模式论,且注重用最通俗最直白的语言阐述相关问题。最后,有一点必须强调的是,全文行文是基于面试题的分析基础之上的,具体实践过程中,还是得具体情况具体分析,且场景也远比本文所述的任何一种情况复杂得多。 OK ,若有任何问题,欢迎随时不吝赐教。谢谢。何谓海量数据处理?所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入
3、内存。那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/ 堆/ 数据库或倒排索引/trie树,针对空间,无非就一个办法:大而化小:分而治之/hash 映射,你不是说规模太大嘛,那简单啊,就把规模大化为规模小的,各个击破不就完了嘛。至于所谓的单机及集群问题,通俗点来讲,单机就是处理装载数据的机器有限(只要考虑 cpu ,内存,硬盘的数据交互 ),而集群,机器有多辆,适合分布式处理,并行计算(更多考虑节点和节点间的数据交互)。再者,通过本blog内的有关海量数据处理的文章:Big Data Processing,我们已经大致知道
4、,处理海量数据问题,无非就是:1. 分而治之 /hash 映射 + hash 统计 + 堆/快速 /归并排序;2. 双层桶划分3. Bloom filter/Bitmap;4. Trie 树/数据库 /倒排索引;5. 外排序;6. 分布式处理之 Hadoop/Mapreduce。下面,本文第一部分、从set/map谈到hashtable/hash_map/hash_set,简要介绍下set/map/multiset/multimap,及 hash_set/hash_map/hash_multiset/hash_multimap之区别 (万丈高楼平地起,基础最重要),而本文第二部分,则针对上述那
5、6种方法模式结合对应的海量数据处理面试题分别具体阐述。第一部分、从 set/map谈到 hashtable/hash_map/hash_set名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 教你如何迅速秒杀掉:99% 的海量数据处理面试题 - 结构之法算法之道 - 博客频道 - CSDN.NEThttp:/ 0:43:33稍后本文第二部分中将多次提到hash_map/hash_set,下面稍稍介绍下这些容器,以作为基础准备。一
6、般来说, STL 容器分两种,序列式容器 (vector/list/deque/stack/queue/heap),关联式容器。关联式容器又分为set( 集合 )和map( 映射表 )两大类,以及这两大类的衍生体multiset( 多键集合)和multimap( 多键映射表 ),这些容器均以RB-tree 完成。此外,还有第3类关联式容器,如hashtable( 散列表 ),以及以 hashtable 为底层机制完成的hash_set( 散列集合 )/hash_map( 散列映射表 )/hash_multiset(散列多键集合 )/hash_multimap(散列多键映射表)。也就是说,set
7、/map/multiset/multimap都内含一个 RB-tree ,而 hash_set/hash_map/hash_multiset/hash_multimap都内含一个 hashtable 。所谓关联式容器,类似关联式数据库,每笔数据或每个元素都有一个键值(key) 和一个实值 (value) ,即所谓的Key-Value(键-值对 )。当元素被插入到关联式容器中时,容器内部结构(RB-tree/hashtable)便依照其键值大小,以某种特定规则将这个元素放置于适当位置。包括在非关联式数据库中,比如,在MongoDB 内,文档 (document) 是最基本的数据组织形式,每个文档
8、也是以Key-Value (键 -值对)的方式组织起来。一个文档可以有多个Key-Value 组合,每个 Value 可以是不同的类型,比如 String 、Integer 、List等等。 name : July, sex : male, age : 23 set/map/multiset/multimap set ,同 map 一样,所有元素都会根据元素的键值自动被排序,因为set/map 两者的所有各种操作,都只是转而调用 RB-tree 的操作行为,不过,值得注意的是,两者都不允许两个元素有相同的键值。不同的是: set的元素不像 map 那样可以同时拥有实值(value) 和键值 (
9、key) ,set 元素的键值就是实值,实值就是键值,而 map 的所有元素都是pair ,同时拥有实值(value) 和键值 (key) ,pair 的第一个元素被视为键值,第二个元素被视为实值。至于 multiset/multimap,他们的特性及用法和set/map 完全相同,唯一的差别就在于它们允许键值重复,即所有的插入操作基于RB-tree 的insert_equal()而非 insert_unique()。hash_set/hash_map/hash_multiset/hash_multimap hash_set/hash_map,两者的一切操作都是基于hashtable 之上。不
10、同的是,hash_set 同set一样,同时拥有实值和键值,且实质就是键值,键值就是实值,而hash_map 同map 一样,每一个元素同时拥有一个实值(value) 和一个键值 (key) ,所以其使用方式,和上面的map 基本相同。但由于hash_set/hash_map都是基于 hashtable 之上,所以不具备自动排序功能。为什么?因为 hashtable 没有自动排序功能。至于 hash_multiset/hash_multimap的特性与上面的multiset/multimap完全相同,唯一的差别就是它们的底层实现机制是 hashtable ,所以它们的元素都不会被自动排序,不过
11、也都允许键值重复。所以,综上,说白了,什么样的结构决定其什么样的性质,因为set/map/multiset/multimap都是基于 RB-tree 之上,所以有自动排序功能,而hash_set/hash_map/hash_multiset/hash_multimap都是基于 hashtable 之上,所以不含有自动排序功能,至于加个前缀multi_ 无非就是允许键值重复而已。此外,关于什么 hash ,请看 blog 内此篇文章: http:/ 内系列文章: http:/ hash_map 的具体应用: http:/ OK ,接下来,请看本文第二部分、处理海量数据问题之六把密匙。名师资料总结
12、 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 教你如何迅速秒杀掉:99% 的海量数据处理面试题 - 结构之法算法之道 - 博客频道 - CSDN.NEThttp:/ 0:43:33第二部分、处理海量数据问题之六把密匙密匙一、分而治之/Hash 映射 + Hash统计 + 堆/ 快速 / 归并排序1 、海量日志数据,提取出某日访问百度次数最多的那个IP 。既然是海量数据处理,那么可想而知,给我们的数据那就一定是海量的。针对这个数据的海量,
13、我们如何着手呢?对的,无非就是分而治之/hash 映射 + hash 统计 + 堆/快速 /归并排序,说白了,就是先映射,而后统计,最后排序:1. 分而治之 /hash 映射:针对数据太大,内存受限,只能是:把大文件化成(取模映射 )小文件,即 16字方针:大而化小,各个击破,缩小规模,逐个解决2. hash 统计:当大文件转化了小文件,那么我们便可以采用常规的hash_map(ip ,value) 来进行频率统计。3. 堆/快速排序:统计完了之后,便进行排序(可采取堆排序 ),得到次数最多的IP。具体而论,则是: “首先是这一天,并且是访问百度的日志中的IP 取出来,逐个写入到一个大文件中。
14、注意到IP 是32 位的,最多有个232 个IP 。同样可以采用映射的方法,比如模1000 ,把整个大文件映射为1000 个小文件,再找出每个小文中出现频率最大的IP (可以采用 hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000 个最大的 IP中,找出那个频率最大的IP ,即为所求。” -十道海量数据处理面试题与十个方法大总结。注: Hash 取模是一种等价映射,不会存在同一个元素分散到不同小文件中去的情况,即这里采用的是mod1000 算法,那么相同的IP在hash 后,只可能落在同一个文件中,不可能被分散的。那到底什么是hash 映射呢?我换个角度举
15、个浅显直白的例子,如本文的URL 是: http:/ 发表在微博上,便被映射成了: http:/ 本身的长度被缩短了,但这两个URL 对应的文章的是同一篇即本文。OK ,有兴趣的,还可以再了解下一致性hash 算法,见 blog 内此文第五部分:http:/ 、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10 个查询串,要求使用的内存不能超过1G。由上面第 1题,
16、我们知道,数据大则划为小的,但如果数据规模比较小,能一次性装入内存呢?比如这第 2题,虽然有一千万个Query ,但是由于重复度比较高,因此事实上只有300 万的 Query ,每个 Query255Byte,因此我们可以考虑把他们都放进内存中去,而现在只是需要一个合适的数据结构,在这里,Hash Table绝对是我们优先的选择。所以我们摒弃分而治之/hash 映射的方法,直接上hash 统计,然后排序。So,1. hash 统计:先对这批海量数据预处理(维护一个 Key 为Query 字串, Value 为该 Query 出现次数的HashTable ,即 hash_map(Query,Va
17、lue) ,每次读取一个Query ,如果该字串不在Table 中,那么加入该字串,并且将Value 值设为 1;如果该字串在Table 中,那么将该字串的计数加一即可。最终我们在O(N) 的时间复杂度内用Hash 表完成了统计;2. 堆排序:第二步、借助堆这个数据结构,找出Top K ,时间复杂度为N logK。即借助堆结构,我们可以在log 量级的时间内查找和调整/移动。因此,维护一个K(该题目中是 10) 大小的小根堆,然后遍历300 万的Query ,分别和根元素进行对比所以,我们最终的时间复杂度是:O(N) + N*O (logK ),(N为1000 万, N 为300 万)。别忘了
18、这篇文章中所述的堆排序思路:“维护 k个元素的最小堆,即用容量为k 的最小堆存储最先遍历到的k个数,并假设它们即是最大的k个数,建堆费时O( k),并调整堆(费时O(logk )后,有 k1k2.kmin(kmin 设为小顶堆中最小元素)。继续遍历数列,每次遍历一个元素x,与堆顶元素比较,若xkmin ,则更新堆(用时logk ),否则不更新堆。这样下来,总费名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 教你如何迅速秒杀掉:
19、99% 的海量数据处理面试题 - 结构之法算法之道 - 博客频道 - CSDN.NEThttp:/ 0:43:33时O( k*logk+ ( n-k )*logk ) =O ( n*logk )。此方法得益于在堆中,查找等各项操作时间复杂度均为logk 。” - 第三章续、Top K算法问题的实现。当然,你也可以采用trie 树,关键字域存该查询串出现的次数,没有出现为0。最后用 10个元素的最小推来对出现频率进行排序。3 、有一个 1G 大小的一个文件,里面每一行是一个词,词的大小不超过16 字节,内存限制大小是1M 。返回频数最高的 100 个词。由上面那两个例题,分而治之 + hash
20、统计 + 堆/快速排序这个套路,我们已经开始有了屡试不爽的感觉。下面,再拿几道再多多验证下。请看此第3题:又是文件很大,又是内存受限,咋办?还能怎么办呢?无非还是:1. 分而治之 /hash 映射:顺序读文件中,对于每个词x,取 hash(x)%5000,然后按照该值存到5000 个小文件(记为 x0,x1,.x4999)中。这样每个文件大概是200k 左右。如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过1M 。2. hash 统计:对每个小文件,采用trie树/hash_map等统计每个文件中出现的词以及相应的频率。3. 堆/归并排序:取
21、出出现频率最大的100 个词(可以用含100个结点的最小堆),并把100 个词及相应的频率存入文件,这样又得到了5000 个文件。最后就是把这5000 个文件进行归并(类似于归并排序)的过程了。4 、海量数据分布在100 台电脑中,想个办法高效统计出这批数据的TOP10。此题与上面第3题类似,1. 堆排序:在每台电脑上求出TOP10 ,可以采用包含10个元素的堆完成(TOP10 小,用最大堆, TOP10 大,用最小堆)。比如求 TOP10 大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆
22、中的元素就是TOP10 大。2. 求出每台电脑上的TOP10 后,然后把这 100 台电脑上的 TOP10 组合起来,共 1000 个数据,再利用上面类似的方法求出 TOP10 就可以了。上述第 4题的此解法,经读者反应有问题,如举个例子如求2个文件中的 top2 ,照上述算法,如果第一个文件里有a 49 次b 50 次c 2 次d 1次第二个文件里有a 9次b 1次c 11 次d 10 次虽然第一个文件里出来top2 是 b( 50 次) ,a( 49次) ,第二个文件里出来top2 是c(11次) ,d (10次) , 然后2个 top2 :b( 50 次) a (49次)与 c( 11
23、次) d( 10 次)归并,则算出所有的文件的top2 是b(50 次),a(49 次),但实际上是a(58次),b(51 次 )。是否真是如此呢?若真如此,那作何解决呢?正如老梦所述:首先,先把所有的数据遍历一遍做一次hash( 保证相同的数据条目划分到同一台电脑上进行运算),然后根据hash 结果重新分布到100 台电脑中,接下来的算法按照之前的即可。最后由于 a可能出现在不同的电脑,各有一定的次数,再对每个相同条目进行求和(由于上一步骤中hash 之后,也方便每台电脑只需要对自己分到的条目内进行求和,不涉及到别的电脑,规模缩小)。5 、有 10 个文件,每个文件1G ,每个文件的每一行存
24、放的都是用户的query,每个文件的query都可能重复。要求你按照 query的频度排序。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 教你如何迅速秒杀掉:99% 的海量数据处理面试题 - 结构之法算法之道 - 博客频道 - CSDN.NEThttp:/ 0:43:33直接上:1. hash 映射:顺序读取10 个文件,按照hash(query)%10的结果将 query 写入到另外 10个文件(记为)中。这样新生成的文件
25、每个的大小大约也1G (假设 hash 函数是随机的)。2. hash 统计:找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个 query 出现的次数。注: hash_map(query,query_count)是用来统计每个query 的出现次数,不是存储他们的值,出现一次,则count+1 。3. 堆/快速 /归并排序:利用快速/堆/归并排序按照出现次数进行排序。将排序好的query 和对应的 query_cout 输出到文件中。这样得到了10个排好序的文件(记为)。对这10个文件进行归并排序(内排序与外排序相结合)。除此之外,此题还有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年教你如何迅速秒杀掉:%的海量数据处理面试题 2022 如何 迅速 杀掉 海量 数据处理 试题
限制150内