统计一个文档中出现频率最多的k个单词的实现

本文介绍了如何统计一个文档中出现频率最多的k个单词,包括在内存足够和不足两种情况下使用Map、HashMap和Unordered_Map进行频率统计,以及使用局部淘汰法解决TopK问题。在实验中,unordered_map表现出了更高的效率。
摘要由CSDN通过智能技术生成

这个问题我们应该经常会见到,想写这个问题是因为微软面试中,面试官问了这问题,而且要写代码,尼玛,最可恨的是不准用容器,哥当时就跪了。。。<T-T>

这个问题就是最常见的topK问题,解决思路:首先统计文档中所有不同word出现的频率,然后对所有不同的word按照出现频率排序,取出出现频率最大的k个words。

1.统计文档中所有不同word出现的频率

统计文档中word的频率的方法,要根据文档的数据量来决定:

(1)如果文档中数据能够全部读入内存,那么可以通过map/hashmap来直接统计各个word出现的频率。之所以采用map/hashmap结构,是因为它们的查找,修改效率很高,map在对数级别,hashmap在常数级别。

(2)如果文档中的word的数据不足以全部读入内存甚至远远超过了内存的容量,那只能通过分治的思想来解决,其中对于大数据比较好的解决办法:将这个文档通过hash(word)%n,hash到n个不同的小文件中,n根据文档的大小以及内存空间而定,hash后,所有相同的word肯定会在同一个文件中,然后分别对这n个文件分别利用map/hashmap来统计其中word的频率,分别求出topk,最后进行合并求总的topk。

2.求topk

当所有不同word的频率求出来之后,就是如何求出topk的问题了,抛开前面的条件,topk问题有很多解法:

(1)最简单的方法,冒泡或选择排序,求出最大的k个元素,时间复杂度在O(kn);

(2)基于快排的选择排序,在随机化的情况下,时间复杂度在O(n);

(3)局部淘汰法1,取前k个元素,建立一个数组,然后遍历所有元素,依次与数组中最小的元素比较,若大于,则替换。这种方法时间复杂度为O(kn);

(4)局部淘汰法2,取前k个元素,维护一个小根堆,遍历所有元素,依次与堆顶元素进行比较,若大于,则替换并重新使其为小根堆,这种方法的时间复杂度为O(nlgk)

(3)和(4)的最大的好处在于只需遍历一边序列就可以得到topk的结果,效率是很高的,还有就是在无法将序列全部加载到内存中时,这两种方法是最好的选择。


这里我采用三种map结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值