在大单词流中查找前K个常见单词

时间:2019-05-13 08:44:26

标签: algorithm hashmap out-of-memory heap

鉴于单词大小未知,我需要在任何给定时间找到k个最频繁的单词,并且该程序应该能够运行很长时间。

我看到的帖子与我正在考虑的解决方案相似
The Most Efficient Way To Find Top K Frequent Words In A Big Word Sequence
How to find the most frequent element in a stream of numbers with additions and deletions allowed
但是我的问题是如何处理内存不足的问题
在帖子中,他们没有提及此问题。

所以我计划存储一个散列,其中键为单词,值为单词频率 还有一个最小的k堆,可以容纳最频繁的单词
对于每个单词,我将增加哈希中的计数,并检查是否可以将其输入到堆中

问题是 该程序应该能够运行很长时间,所以有可能我会以较小的频率听到不同的单词
并且我需要将它们保存在哈希中,以防频率稍后在流上增加
这会造成内存问题,因为随着时间的流逝,散列会变得很大

我想知道唯一的解决方案是删除某些单词吗?
(但这会更改计数)

我不确定如何处理,有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您可以使用trie。并存储到目前为止的出现次数。

以下树对应于以下输入:

ABL ABO AC AC AC ACR ACR

enter image description here

然后整理当前单词,您增加相应的计数器并检查它是否大于k个最频繁列表中最小的一个,如果是,请替换。

因此,您需要O(1)时间来处理每个传入的字符。