Divide and conquer
12/12/25About 2 min
Divide and conquer
对于海量数据而言,由于无法一次性装进内存处理,导致我们不得不把海量的数据通过 hash 映射分割成相应的小块数据,然后再针对各个小块数据通过 hash_map 进行统计或其它操作。
那什么是 hash 映射呢?简单来说,就是为了便于计算机在有限的内存中处理 big 数据,我们通过一种映射散列的方式让数据均匀分布在对应的内存位置(如大数据通过取余的方式映射成小数存放在内存中,或大文件映射成多个小文件),而这个映射散列方式便是我们通常所说的 hash 函数,设计的好的 hash 函数能让数据均匀分布而减少冲突。
有一个 1G 大小的一个文件,里面每一行是一个词,词的大小不超过 16 字节,内存限制大小是 1M。返回频数最高的 100 个词
解法:
分而治之/hash 映射
顺序读取文件,对于每个词 x,取 hash(x)%5000,然后把该值存到 5000 个小文件(记为 x0,x1,...x4999)中。这样每个文件大概是 200k 左右。当然,如果其中有的小文件超过了 1M 大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过 1M。
hashMap 统计
对每个小文件,采用 Trie/hashMap 等统计每个文件中出现的词以及相应的频率。
堆/归并排序
取出出现频率最大的 100 个词(可以用含 100 个结点的最小堆)后,再把 100 个词及相应的频率存入文件,这样又得到了 5000 个文件。最后就是把这 5000 个文件进行归并(类似于归并排序)的过程了。