失效链接处理 |
数据处理面试题 PDF 下载
本站整理下载:
相关截图:
主要内容:
前言
一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了
哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也
甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章:十道海量数据处理
面试题与十个方法大总结的一般抽象性总结。
毕竟受文章和理论之限,本文将摒弃绝大部分的细节,只谈方法/模式论,且
注重用最通俗最直白的语言阐述相关问题。最后,有一点必须强调的是,全文行
文是基 于面试题的分析基础之上的,具体实践过程中,还是得具体情况具体分
析,且场景也远比本文所述的任何一种情况复杂得多。
OK,若有任何问题,欢迎随时不吝赐教。谢谢。
何谓海量数据处理?
所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,
就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,
导致无法一次性装入内存。
那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如
Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie 树,针对空间,无非就一个
办法:大而化小:分而治之/hash 映射,你不是说规模太大嘛,那简单啊,就把
规模大化为规模小的,各个击破不就完了嘛。
至于所谓的单机及集群问题,通俗点来讲,单机就是处理装载数据的机器有
限(只要考虑 cpu,内存,硬盘的数据交互),而集群,机器有多辆,适合分布式
处理,并行计算(更多考虑节点和节点间的数据交互)。
再者,通过本 blog 内的有关海量数据处理的文章:Big Data Processing,我
们已经大致知道,处理海量数据问题,无非就是:
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 之区别(万丈高楼平地起,基
础最重要),而本文第二部分,则针对上述那 6 种方法模式结合对应的海量数据
处理面试题分别具体阐述。
第一部分、从 set/map 谈到 hashtable/hash_map/hash_set
稍后本文第二部分中将多次提到 hash_map/hash_set,下面稍稍介绍下这些容器,以作
为基础准备。一般来说,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/map/multiset/multimap 都内
含一个 RB-tree,而 hash_set/hash_map/hash_multiset/hash_multimap 都内含一
个 hashtable。
所谓关联式容器,类似关联式数据库,每笔数据或每个元素都有一个键值(key)
和一个实值(value),即所谓的 Key-Value(键-值对)。当元 素被插入到关联式容
器中时,容器内部结构(RB-tree/hashtable)便依照其键值大小,以某种特定规则
将这个元素放置于适当位置。
包括在非关联式数据库中,比如,在 MongoDB 内,文档(document)是最基
本的数据组织形式,每个文档也是以 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)和键值(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 之上。不同的是,
hash_set 同 set 一样,同时拥有实值和键值,且 实质就是键值,键值就是实值,
而 hash_map 同 map 一样,每一个元素同时拥有一个实值(value)和一个键值
(key),所以其使用方式,和上面 的 map 基本相同。但由于 hash_set/hash_map
都是基于 hashtable 之上,所以不具备自动排序功能。为什么?因为 hashtable 没
有自动排序功能。
至于 hash_multiset/hash_multimap 的特性与上面的 multiset/multimap 完全
相同,唯一的差别就是它们 hash_multiset/hash_multimap 的底层实现机制是
hashtable(而 multiset/multimap,上面说了,底层实 现机制是 RB-tree),所以
它们的元素都不会被自动排序,不过也都允许键值重复。
所以,综上,说白了,什么样的结构决定其什么样的性质,因为
set/map/multiset/multimap 都是基于 RB-tree 之上,所以有自动排序功能,而
hash_set/hash_map/hash_multiset/hash_multimap 都是基于 hashtable 之上,
所以不含有自动排序功能,至于加个前缀 multi_无非就是允许键值重复而已。
此外
|