面试经典的海量数据处理(TOPK)问题—转载+个人见解!
常见问题: ① Top K问题 : 分治+Trie树/Hash_map+小顶堆 。采用Hash(x)%M将原文件分割成小文件,如果小文件太大则继续Hash分割,直至可以放入内存。 ② 重复问题 : BitMap位图 或 Bloom Filter布隆过滤器 或 Hash_set集合 。每个元素对应一个bit处理。 ③ 排序问题 : 外排序 或 BitMap位图 。分割文件+文件内排序+文件之间归并。 Top K问题: 1. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。 ①分治:顺序读文件,对每个词x取Hash(x)%2000,按照该值存到2000个小文件中。每个文件是500k左右。如果有文件超过了1M则继续分割。O(N) ②Trie树/Hash_map:字符串用Trie树最好。对每个小文件,统计其中出现的词频。 O(N)*(平均字符长度),长度一般是常数,也就是O(N). ③小顶堆:用容量为100的小顶堆,以频率为value值插入,取每个文件现频率最大的100个词,把这100个词及相应的频率存入文件。最差O(N)*lg(100),也就是O(N). 注:2,3步骤合起来需要一轮磁盘存取过程。存入文件的个数可以缩减一下,因为主要开销在磁盘读取上,减少文件读取次数,可以在每个文件存取最大容量的字符数量,比如这道题1*(