题目背景
只有2G内存的pc机,在一个存有10G个整数的文件,从中找到中位数
思路
数据量太大,无法在较短时间内迅速解决,或者无法一次性装入内存。每个数字在内存中占4B,10亿个数字完全加载到内存中需要:10*108*4B ,约为:4GB内存。显然不能把所有的数字都装入内存
中位数定义:数字排序之后,位于中间的那个数。比如将10亿个数字进行排序(位置从1到10亿),排序之后,位于第5亿个位置的那个数 就是中位数
方法一
对于数据量大,数据相似度高的数据集,我们可以使用Trie数
Trie树是一种非常强大的处理海量字符串数据的工具。尤其是大量的字符串数据中存在前缀时,Trie树特别好用。Trie树在字典的存储,字符串的查找,求取海量字符串的公共前缀,以及字符串统计等方面发挥着重要的作用。用于存储时,Trie树因为不重复存储公共前缀,节省了大量的存储空间;用于以字符串的查找时,Trie树依靠其特殊的性质,实现了在任意数据量的字符串集合中都能以O(len)的时间复杂度完成查找(len为要检索的字符串长度);在字符串统计中,Trie树能够快速记录每个字符串出现的次数。
方法二
堆排序,求top5G的数据,但是内存只有2G,所以我们先构建一个1G大小的大顶堆,然后求出第1G个元素,然后利用该元素构建一个新的1G大小的堆,求出第2G大的元素,依次类推,求出第5G大的元素,需要遍历5次这个元素集合