1. 排序、top k
- 含有重复值:桶排序(将数据映射到有序桶中),每个桶再进行排序。其次还可以结合堆来实现 top k
- 不含重复值:直接使用BitMap来做,每一个bit位都代表一个数字,比如若数字为 32,就可以 有bitSet.set(32),代表第32个bit位上有数字。——可以推出,16亿数字只会消耗 16*10^9个bit,即只会占用2G空间
2. 包含统计信息的排序、top k
【举个例子:有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。】
- 解决思路:
1. 设计M个桶(文件)——split
2. 依次读取1M的数据,然后按 hash(word) % M 进行映射——partition
3. 依次读取每一个桶的数据入内存,进行合并统计——merge、count
4. 如果发现桶的数据量太大,则对该 桶 进一步 分割(递归走 步骤 1 到 4)——递归
5. 直到统计完毕,每个桶中都读取前k(100)个词进内存,然后进行top k (小顶堆)
【再举个例子:包含200亿的int数据,内存限制100MB,不准写外存,寻找中位数】
- 解决思路:这个就有点特殊了