题目描述
某搜索引擎,就比如百度,每天的用户搜索词汇是百亿数据量,请设计一种算法,求出每天热门Top100词汇。
思路分析
首先,还是基于哈希分流的思想,用哈希函数,将问题映射到N台分布式计算机上统计各个搜索词频。
假设1000台分布式计算机,那么,此时,原始的数据就平均分成了1000份,并且,因为哈希函数的性质,相同的数据肯定会被分配到相同的分布式计算机上,因此,这1000台各自统计的数据都是正确无误的,相同词汇不可能出现在两台分布式计算机上。
然后,在各自的分布式计算机上,维护一个大根堆,堆顶就是出现频次最高的词汇。
然后,取出每一个大根堆的堆顶,再组成一个总的大根堆,此时,这个总大根堆的堆顶就是当天词频第一的,然后,词频第一的词出总堆,同时他也从他所在的分布式堆顶出堆,然后,这个词汇是从哪一个分布式上的大根堆出来的,就让那个分布式的新堆顶入总大根堆,然后,再从总大根堆选出第二高频词,依次循环上述步骤,选出前100个。
总结
说白了,先用哈希分流,挨个统计,然后,把每个的最大值,再放入总的一起比较出最大值,然后依次更新总的堆。因为是堆结构,因此出堆调整堆的时间复杂度都是O(logn)