Stream 如何从count min sketch中获取前K个元素?

Stream 如何从count min sketch中获取前K个元素?,stream,real-time,distributed-computing,frequency,count-min-sketch,Stream,Real Time,Distributed Computing,Frequency,Count Min Sketch,我正在阅读概率数据结构count min sketch如何用于查找数据流中的前k个元素。但是,我似乎不能把我的头绕在我们保持一堆以得到最终答案的台阶上 问题是: 我们有一系列的项目[B,C,a,B,C,a,C,a,…]。我们被要求找出出现频率最高的k 项目 我的理解是,这可以通过微批处理来完成,在我们开始做一些实际工作之前,我们积累N个项目 hashmap+heap方法对我来说很容易理解。我们遍历微批次并通过计算元素构建频率图(例如,{B:34,D:65,C:9,a:84,})。然后,我们通过遍

我正在阅读概率数据结构count min sketch如何用于查找数据流中的前k个元素。但是,我似乎不能把我的头绕在我们保持一堆以得到最终答案的台阶上

问题是:

我们有一系列的项目
[B,C,a,B,C,a,C,a,…]
。我们被要求找出出现频率最高的k 项目

我的理解是,这可以通过微批处理来完成,在我们开始做一些实际工作之前,我们积累N个项目

hashmap+heap方法对我来说很容易理解。我们遍历微批次并通过计算元素构建频率图(例如,
{B:34,D:65,C:9,a:84,}
)。然后,我们通过遍历频率映射来维护大小为k的最小堆,根据需要使用每个
[item]:[freq]
添加到堆中并从堆中逐出。直截了当,没有什么花哨

现在有了CMS+heap,而不是hashmap,我们有了这个概率有损2D数组,我们通过遍历微批来构建它。问题是:考虑到这个CMS,我们如何保持最小堆大小k?

CMS只包含一组数字,而不是原始项目。除非我还从微批处理中保留了一组独特的元素,否则我无法知道最终需要针对哪些项构建堆。但是,如果我这样做了,那不是违背了使用CMS来节省内存空间的目的吗

我还考虑在遍历列表时实时构建堆。随着每个项目的到来,我们可以快速更新CMS,并获得该项目在该点的累积频率。但这个频率数字是累积的,这一事实对我帮助不大。例如,使用上面的示例流,我们将得到
[B:1,C:1,A:1,B:2,C:2,A:2,C:3,A:4,…]
。如果我们使用相同的逻辑来更新我们的最小堆,我们将得到错误的答案(重复)


我肯定错过了一些东西。请帮助我理解。

下面的解释来自此网站的评论:

我们需要存储密钥,但只存储K个(或更多)。不是全部。 当每一个关键点出现时,我们将执行以下操作:

  • 将其添加到count min草图中
  • 从“最小计数”草图中获取关键点计数
  • 检查当前密钥是否在堆中。如果它出现在堆中,我们将在那里更新它的计数值。如果堆中不存在,则检查堆是否已满。如果未满,则将该键添加到堆中。如果heap已满,则检查最小heap元素,并将其值与当前键计数值进行比较。此时,我们可以删除最小元素并添加当前键(如果当前键计数>最小元素值)