- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
海量数据
第6章 海量数据处理1
本章导读
所谓海量数据处理,是指基于海量数据的存储、处理、和操作。正因为数据量太大,所以导致要么
法在较短时间内迅速解决,要么无法一次性装入内存。
事实上,针对时间问题,可以采用巧妙的算法搭配合适的数据结构 (如布隆过滤器、哈希、位图、堆、
数据库、倒排索引、Trie树)来解决;而对于空间问题,可以采取分而治之 (哈希映射)的方法,也就是
说,把规模大的数据转化为规模小的,从而各个击破。
此外,针对常说的单机及集群问题,通俗来讲,单机就是指处理装载数据的机器有限(只要考虑CPU、
内存、和硬盘之间的数据交互),而集群的意思是指机器有多台,适合分布式处理或并行计算,更多考虑
节点与节点之间的数据交互。
一般说来,处理海量数据问题,有以下十种典型方法:
1. 哈希分治;
2. simhash算法;
3. 外排序;
4. MapReduce;
5. 多层划分;
6. 位图;
7. 布隆过滤器;
8. Trie树;
9. 数据库;
1 本章为书籍初稿第6章,并在博客文章《教你如何迅速秒杀掉:99%的海量数据处理面试题》:
/v_july_v/article/details/7382693 的基础上优化。本初稿还会经过一轮的改进优化,最终将被收录于今
2014年内出版的新书中。如有任何改进意见,欢迎通过微博:/julyweibo 向我反馈,thanks。July、二零一
四年八月十八日晚。
10.倒排索引。
受理论之限,本章将摒弃绝大部分的细节,只谈方法和模式论,注重用最通俗、最直白的语言阐述相
关问题。最后,有一点必须强调的是,全章行文是基于面试题的分析基础之上的,具体实践过程中,还得
视具体情况具体分析,且各个场景下需要考虑的细节也远比本章所描述的任何一种解决方案复杂得多。
6.1 关联式容器
一般来说,STL容器分两种:序列式容器和关联式容器。
序列式容器包括vector、list、deque、stack、queue、heap等容器。而关联式容器,每笔数据或每
个元素都有一个键值 (ke )和一个实值 (value),即所谓的键-值对 (Key-Value)。当元素被插入到关联
式容器中时,容器的内部结构 (可能是红黑树,也可能是哈希表)便依照其键值大小,以某种特定规则将
这个元素放置于适当位置。
在C++ 11标准之前,旧标准规定标准的关联式容器分为set (集合)和map (映射表)两大类,以及
这两大类的衍生体multiset(多键集合)和multimap(多键映射表),这些容器均基于红黑树(red-blacktree)
实现。此外,还有另一类非标准的关联式容器,即hashtable (哈希表,又称散列表),以及以hashtable
为底层实现机制的hash_set (散列集合)、hash_map (散列映射表)、hash_multiset (散列多键集合)、和
hash_multimap (散列多键映射表)。
也就是说,set、map、multiset、和multimap 都内含一个red-black tree,而hash_set、hash_map、
hash_multiset、和hash_multimap都内含一个hashtable 。2
set/map/multiset/multimap
set,同map一样,所有元素都会根据元素的键值自动被排序,因为set和map两者的所有各种操作,
都只是转而调用red-blacktree 的操作行为。不过,值得注意的是,两者都不允许任意两个元素有相同的键
值。
不同的是:set 的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,
实值就是键值,而map 的所有元素都是pair,同时拥有实值和键值,pair 的第一个元素被视为键值,第二
个元素被视为实值。
2 C++ 11标准之后,准备引入非标准的关联式容器hashtable,但为了避免与已经存在的hash_map等
第三方容器产生名字冲突,故命名了基于 hash 函数实现的 unordered_set、unordered_map,和
unordered_multiset、unordered_multimap,相当于hash_set、hash_ma,和hash_multiset、hash_multimap。
但采用哪种名字不是本书的重点,所以下文在用到无序的关联式容器时,依然会
原创力文档


文档评论(0)