2 回答
TA贡献1858条经验 获得超8个赞
您还可以维护所有三个数据结构 1. Count-min 草图以存储您在流中遇到的所有内容 2. 大小为 k 的最小堆 3. 大小为 k 的哈希图
如果是热门项目 - 您增加计数并从 count-min 草图中获取新频率,假设此项目已存在于 min-heap 中,则您从哈希映射中获取该项目并增加频率
当您遇到一个频率刚刚增加并进入著名的最小堆的不同项目时,您可以同时从最小堆和哈希映射中驱逐根,因此基本上最小堆可以帮助您维护前 k 个频繁项目和哈希-map 随机访问那些频繁项目。请注意,min-heap 和 hash-map 都可以映射到相同的内存地址,因此更新频率只能对存储在 hash-map 中的项目进行
TA贡献1877条经验 获得超6个赞
维护[key,<frequency,position>]
堆中已经存在的对的哈希图是有意义的。position
指的是堆内键的索引(假设是基于数组的堆)。当键到达时,您检查 2 个条件:
- 键在哈希图中
- 它的频率已经改变
如果两者都为真,你会O(1)
及时在堆中找到键,因为你已经将它的位置存储在哈希图中,然后修改键的频率,并根据频率是增加还是减少,你从那个位置(O(logn)
)。更改位置后,您可以使用新的频率和位置值更新该键的哈希图条目。
如果第一个为假,则遵循通常的逻辑,即将键与根进行比较,如果堆已满且键的频率大于根的频率,则将根从堆中弹出并将其从哈希图中删除,同时插入进入堆和哈希映射的键。
如果键在哈希图中但它的频率没有改变,你什么都不做。
添加回答
举报