【发布时间】:2019-04-05 07:22:54
【问题描述】:
我需要将前 k 个最常见的元素存储在一个流中。为了估计频率,我使用 count-min-sketch 算法。我的流由键(作为字符串)组成。所以基本上每次我在我的流中遇到一个新键时,我都会通过查看 count-min-sketch 数据结构来计算当前键的频率。但是我无法存储前 k 个最常用的键。
我的第一个想法是将它们存储在一个固定大小为 k 的最小堆中。我用比较器比较频率将 [频率,键] 存储在这个最小堆中。所以每次我得到一个密钥的频率时,我都会尝试查看堆大小是否超过 k,如果是,那么我将当前密钥的频率与最小堆中的顶部(最小)频率进行比较,如果我当前的密钥是频率大于我弹出顶部,然后将我的密钥插入堆中。
但是我意识到最小堆不是一个集合,这意味着它允许重复。假设我有一个非常热的键,我一直在流中计算它,所以每次我将这个 [频率,键] 插入堆时,最终我的堆将充满相同的键,只是频率不同。
所以我想知道是否有一种好方法可以将前 k 个不同的更频繁元素存储在 count-min-sketch 中。
【问题讨论】:
标签: java data-structures heap count-min-sketch