海量数据处理问题

问题一:
        怎么在海量数据中找出重复次数最多的一个?
        思路:先将海量数据经过哈希表统计出数据的频率并映射为100个小文件,小文件中的数据包括两项(数值,出现次数),而后再对每个小文件求出重复次数最多的一个数据而后将各个小文件出现最多的数据项目经过二路归并进行比较,找出频率最大的即为所求
       性能:时间复杂度:O(N)+100*O(N1)+O(nlogn)*/
 问题二: 10亿个数中找出最大的10000个数(top K问题)
       先拿10000个数建堆,而后一次添加剩余元素,若是大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时间复杂度是O(mlogm),算法的时间复杂度为O(nmlogm)(n为10亿,m为10000)。

        优化的方法:能够把全部10亿个数据分组存放,好比分别放在1000个文件中。这样处理就能够分别在每一个文件的10^6个数据中找出最大的10000个数,合并到一块儿在再找出最终的结果。算法

top K问题

        在大规模数据处理中,常常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题一般被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。

        针对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位数电话号码的内容。优化

相关文章
相关标签/搜索