海量数据统计topK

有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。

思路:

把这1G的数据一次性全部读入内存是不可能了,可以每次读一行,然后将该词存到一个哈希表里去,哈希表的value是词出现的次数。

现在的问题是,这个哈希表有多大,能不能装载1M的内存中去。

假设这1G文件里每个词都不一样,那么最多有不同的1G/1Byte = 1G个词,一个哈希表的节点中包含了单词(key),频率(value),next指针,则内存至少要24bytes * 1G,这显然大大超了。不过如果题目告诉我们顶多有一百万个不同的词,那么 24bytes*1M=24M,对于大多数的机器,这个哈希表是可以建立的,当然此题内存只有1M,连24M的哈希表都装不下。

因此我们的第一步是将所有的词分到不同的文件中去,相同的词要分到相同的文件中去。这样文件的规模小了,建立的哈希表也就小了。

将单词的哈希值对5000取模,根据结果将单词分配到5000个文件中去。这样,平均情况下,一个文件中有1G/5000 = 0.2M个词,哈希表基本上能装得下了。

对每个文件进行hashmap统计,将词与频率写到一个新的文件中,得到5000个新文件。

维护一个100个节点的最小堆,依次读5000个文件中的每一条记录。如果频率小于堆顶,证明该词比堆里的100个单词频率都低,不可能进top100,舍弃。如果频率大于堆顶,就将该词至于堆顶,然后调用维护函数,维护最小堆的性质。所有的记录遍历完了,最小堆中的单词就是结果。

总结:

哈希表的大小不是根据单词的数量,而是根据不同单词的数量。

最大的topK用最小堆,最小的topK用最大堆。

算法的时间复杂度:

分小文件 O(n)

hashmap统计 O(n)

维护最小堆 O(n‘logK)   n‘是不同的单词数,K是topK

时间: 2024-11-07 20:22:50

海量数据统计topK的相关文章

最全BAT算法面试100题:阿里、百度、腾讯、京东、美团、今日头条

第一:复杂度估算和排序算法(上)1) 时间复杂度和空间复杂度 2)认识对数器 3)冒泡排序 4)选择排序 5)插入排序 6)如何分析递归过程的时间复杂度 7)归并排序 8)小和问题 第二:复杂度估算和排序算法(下)1)荷兰国旗问题 2)随机快速排序 3)堆结构与堆排序 4)认识排序算法的稳定性 5)认识比较器 6)桶排序 7)计数排序 8)基数排序 9)数组排序后的最大差值问题 10)排序算法在工程中的应用 第三:章栈.队列.链表.数组和矩阵结构1)栈结构 2)队列结构 3)链表结构 4)数组结

我的阿里、腾讯暑期实习Offer经历

三四月份对我拿来说是个忙碌的两个月,实验室项目到了关键的时刻,自己又需要抽身去找暑期实习,总之过得很快.值得欣慰的是幸运的拿到了阿里和腾讯的暑期实习offer,也算是对三四月份的忙碌一些回报吧.阿里的实习内推很快就来了,3月份就差不多全部结束了,腾讯稍微晚一些,原本也投了百度,想试试百度的难度,可惜笔试当天晚上要出差飞广州,也就错过了百度的笔试,对我来说,北京的诱惑并没有非常的强烈,对我的吸引力不算太强,北京的压力型节奏的生活方式让我总觉得会踹不过气,也就不了了之了.拿到阿里和腾讯的实习offe

PHP内核探索之变量(7)- 不平凡的字符串

切,一个字符串有什么好研究的. 别这么说,看过<平凡的世界>么,平凡的字符串也可以有不平凡的故事.试看: (1)       在C语言中,strlen计算字符串的时间复杂度是?PHP中呢? (2)       在PHP中,怎样处理多字节字符串?PHP对unicode的支持如何? 同样是字符串,为什么c语言与C++/PHP/Java的均不相同? 数据结构决定算法,这句话一点不假. 那么我们今天就来掰一掰,PHP中的字符串结构,以及相关字符串函数的实现. 一.  字符串基础 字符串可以说是PHP中

云-腾讯云:腾讯云

ylbtech-云-腾讯云:腾讯云 腾讯云—腾讯倾力打造的云计算品牌,以卓越科技能力助力各行各业数字化转型,为全球客户提供领先的云计算.大数据.人工智能服务,以及定制化行业解决方案. 1.返回顶部 1. 腾讯云有着深厚的基础架构,并且有着多年对海量互联网服务的经验,不管是社交.游戏还是其他领域,都有多年的成熟产品来提供产品服务.腾讯在云端完成重要部署,为开发者及企业提供云服务.云数据.云运营等整体一站式服务方案. 具体包括云服务器.云存储.云数据库和弹性web引擎等基础云服务:腾讯云分析(MTA

巨杉Tech | SparkSQL+SequoiaDB 性能调优策略

当今时代,企业数据越发膨胀.数据是企业的价值,但数据处理也是一种技术挑战.在海量数据处理的场景,即使单机计算能力再强,也无法满足日益增长的数据处理需求.所以,分布式才是解决该类问题的根本解决方案.而在分布式领域,有两类典型产品,分别是分布式存储和分布式计算.用户只有将两者的特性充分利用,才可以真正发挥分布式架构的存储和计算能力. 本文介绍 SequoiaDB(分布式存储)和 Spark(分布式计算)两款产品的对接使用,以及在海量数据场景下如何提高统计分析性能. 01  SequoiaDB 与 S

MapReduce TopK统计加排序

Hadoop技术内幕中指出Top K算法有两步,一是统计词频,二是找出词频最高的前K个词.在网上找了很多MapReduce的Top K案例,这些案例都只有排序功能,所以自己写了个案例. 这个案例分两个步骤,第一个是就是wordCount案例,二就是排序功能. 一,统计词频 1 package TopK; 2 import java.io.IOException; 3 import java.util.StringTokenizer; 4 5 import org.apache.hadoop.co

海量数据面试题----分而治之/hash映射 + hash统计 + 堆/快速/归并排序

1.从set/map谈到hashtable/hash_map/hash_set 稍后本文第二部分中将多次提到hash_map/hash_set,下面稍稍介绍下这些容器,以作为基础准备.一般来说,STL容器分两种: 序列式容器(vector/list/deque/stack/queue/heap), 关联式容器.关联式容器又分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表),这些容器均以RB-tree完成.此外,还有第3类关

从海量数据中寻找出topK的最优算法代码

package findMinNumIncludedTopN;/** * 小顶堆 * @author TongXueQiang * @date 2016/03/09 * @since JDK 1.8 */public class MinHeap { int[] heap; int heapsize; public MinHeap(int[] array) {  this.heap = array;  this.heapsize = heap.length; }  /**  * 构建小顶堆  */

海量数据问题

在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题.例如,在搜索引擎中,统计搜索最热门的10个查询词:在歌曲库中统计下载最高的前10首歌等. 一.重复问题 在海量数据中查找出重复出现的元素或者去除重复出现的元素也是常考的问题.针对此类问题,一般可以通过位图法实现.例如,已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数. 本题最好的解决方法是通过使用位图法来实现.8位整数可以表