1. 教你如何迅速秒杀掉:99%的海量数据处理面试题
1.1 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。
什么样的结构决定其什么样的性质,因为set/map/multiset/multimap都是基于RB-tree之上,所以有自动排序功能,而hash_set/hash_map/hash_multiset/hash_multimap都是基于hashtable之上,所以不含有自动排序功能,至于加个前缀multi_无非就是允许键值重复而已。
1.2 密匙一、分而治之/Hash映射 + Hash_map统计 + 堆/快速/归并排序
1.2.1 海量日志数据,提取出某日访问百度次数最多的那个IP
Hash映射将大文件分成小文件,同时保证相同的IP记录分在同一个小文件中,然后进行Hash_map统计,再排序,得到每个小文件中的Top1,最后对所有的Top1排序。
1.2.2 寻找热门查询,300万个查询字符串中统计最热门的10个查询
当内存可以完全容纳的时候,就不需要分而治之,直接运用Hash_map统计每个查询字符串出现的次数,然后求解Top10。
1.2.3 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词
顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件;对每个小文件,采用trie树/hash_map等统计每个文件中出现的词以及相应的频率;取出出现频率最大的100个词(可以用含100个结点的最小堆)后,再把100个词及相应的频率存入文件,这样又得到了5000个文件。最后就是把这5000个文件进行归并(类似于归并排序)的过程了。
1.2.4 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10
如果同一个元素重复出现在不同的电脑中,这个时候,你可以有两种方法:(1)遍历一遍所有数据,重新hash取摸,如此使得同一个元素只出现在单独的一台电脑中;(2)暴力求解:直接统计每台电脑中各个元素的出现次数,然后把同一个元素在不同机器中的出现次数相加,最终从所有数据中找出TOP10。
1.2.5 有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序
1.2.6 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url
1.2.7 小结
分而治之的关键在于保证同样的记录被分在同一个小文件中,运用Hash映射。分解完之后就是Hash_map和排序过程,其中堆排序、外部排序和TopK排序最重要。
1.3 密匙二、双层桶划分
其实质还是在于分而治之的思想,只是多重划分,不一定局限于双层。
适用范围:第k大,中位数,不重复或重复的数字。
1.3.1 2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数
将2.5亿个整数Hash映射到若干个小文件中,然后运用bitmap即可。
1.3.2 5亿个int找它们的中位数
将5亿个int映射到若干个小文件中,统计各个小文件的大小,确定中位数位于哪个小文件中,再运用SelectK算法。
1.4 密匙三:Bloomfilter/Bitmap
对Bloom filter的专门研究见后续学习。
1.4.1 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中
用位图/Bitmap的方法,申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。
1.5 密匙四、Trie树/数据库/倒排索引
Trie树、数据库索引技术、倒排索引的专门研究见后续学习。
1.6 密匙五、外排序
外排序的专门研究见后续学习。
1.7密匙六、分布式处理之Mapreduce
Mapreduce的专门研究见后续学习。
1.8 总结
六大密钥,第一点是最重要的,后续的只是处理方法。总之对大数据处理要把握最重要的思想:分而治之。此中,Hash技术、各种容器运用、各种排序、各种索引技术是最关键的。