概述
类似 TOP K 问题:
- 1 亿 个数中找出最大的 100 个
- 1 亿个浮点数,怎么找出第 5 大的数
- 1T 的数据存储用户访问信息,机器内存只有 16 G,如何查出访问频率最高的前 1000 个用户
思路
堆排序
若数据量比较小,机器内存空间较大,直接使用一个小根堆或者大根堆保存 TOP K 的数据,每次遍历的时候与堆的根元素进行比较,并调整堆中的元素。
空间复杂度:O(1)
时间复杂度:O(NlogK),N 为总数据量,K 为要求的前 K 个数的值
分治 + 堆排序
机器内存紧张,可以将大的数据分块成多个小块数据,然后对小块数据进行排序,保存 TOK N 的数据,最后将小块数据进行合并排序。
注意,这里分块的依据要根据物理机的内存以及分块数据的大小进行,一个只有 2G 内存的机器,不可能真的分 2G 数据给它,一定要小于 2G。
重复数据
若重复数据较多,可以先进行 hash 去重,缩小运算空间