优化的方法:能够把全部10亿个数据分组存放,好比分别放在1000个文件中。这样处理就能够分别在每一个文件的10^6个数据中找出最大的10000个数,合并到一块儿在再找出最终的结果。算法
针对top K类问题,一般比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到的最小堆),即先将数据集按照Hash方法分解成多个小数据集,而后使用Trie树或着Hash统计每一个小数据集中的query词频,以后用小顶堆求出每一个数据集中出现频率最高的前K个数,最后在全部top K中求出最终的top K。post
(1)有10000000个记录,这些查询串的重复度比较高,若是除去重复后,不超过3000000个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请统计最热门的10个查询串,要求使用的内存不能超过1GB。
(2)有10个文件,每一个文件1GB,每一个文件的每一行存放的都是用户的query,每一个文件的query均可能重复。按照query的频度排序。
(3)有一个1GB大小的文件,里面的每一行是一个词,词的大小不超过16个字节,内存限制大小是1MB。返回频数最高的100个词。
(4)提取某日访问网站次数最多的那个IP。
(5)10亿个整数找出重复次数最多的100个整数。
(6)搜索的输入信息是一个字符串,统计300万条输入信息中最热门的前10条,每次输入的一个字符串为不超过255B,内存使用只有1GB。
(7)有1000万个身份证号以及他们对应的数据,身份证号可能重复,找出出现次数最多的身份证号。性能
在海量数据中查找出重复出现的元素或者去除重复出现的元素也是常考的问题。针对此类问题,通常能够经过位图法实现。例如,已知某个文件内包含一些电话号码,每一个号码为8位数字,统计不一样号码的个数。
本题最好的解决方法是经过使用位图法来实现。8位整数能够表示的最大十进制数值为99999999。若是每一个数字对应于位图中一个bit位,那么存储8位整数大约须要99MB。由于1B=8bit,因此99Mbit折合成内存为99/8=12.375MB的内存,便可以只用12.375MB的内存表示全部的8位数电话号码的内容。优化