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