TOPK算法
网眼袋 TOPK问题是⾮常经典的处理海量数据的问题。TOPK问题就是给出⼀堆数,在⾥⾯出最⼤、最常出现的等⼀系列问题。磁卡电表
通常情况下,数量级都是千万级别的,数据量特别⼤,⽽且内存使⽤是有限制的,所以肯定不能先排序,然后再遍历取出K个数。 堆排序做TopK算法有如下⼏个特点:
刷式密封 1、不会改变数据的输⼊顺序;
2、不会占⽤太多的内存空间(事实上,⼀次只读⼊⼀个数,内存只要求能容纳前K个数即可);
3、由于2,决定了它特别适合处理海量数据。
此外,还有⼀点要注意:要出最⼩的K个元素使⽤⼤顶堆,求最⼤的K个元素使⽤⼩顶堆。⼩对⼤,⼤对⼩,很好记。
以下是⼀些经常被提及的该类问题。
(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万个⾝份证号以及他们对应的数据,⾝份证号可能重复,出出现次数最多的⾝份证号。
汽车空调电磁离合器
TOPN问题
TOPN就是给出⼀个数组,出前N个最⼤的元素。
⽐如:
1. 电商⽹站中到每个商品分类下⽤户点击最多的5个商品是什么等等。
2. 给定⼀个⼏百G的Nginx访问⽇志⽂件,取出访问频率在top100的IP。
问题:有10000个数字,那么求出前n个最⼤的数?有⼏种解法
1. 先给数排序,然后截取前n个。不过这后⾯10000 - n个数字是不需要排序的。
2. 利⽤堆排序。
3. 先截取前n个数,然后n+1的数和这n个⾥⾯的最⼩数最对⽐,如果⼤于最⼩的数则将该数添加进⼊这n数⾥⾯,再将n⾥⾯最⼩的数剔除,这样到最后输出出来的就是前n最⼤的数。
印第安笛
康q 其实TOPN问题可以⽤分治法解决,这个问题与快速排序类似,快速排序是⽤⼀个数对数组进⾏划分,topN问题则不需完成排序,只需划分出前n个最⼤的数字即可。所以可以采⽤快排中partition函数 的操作,将每次操作的返回值与N作对⽐,若⽐N⼩则对N及其后续的元素继续进⾏划分,若⽐N⼤则对N及其之前的元素进⾏划分,直到出N。
4. 也可以使⽤MapReduce来解决TOPN问题。