Algorithm 在任何时候,我们都需要根据数量来告诉前k名的产品

Algorithm 在任何时候,我们都需要根据数量来告诉前k名的产品,algorithm,data-structures,hashmap,heap,Algorithm,Data Structures,Hashmap,Heap,数据流正在到来。 数据包含产品Id和数量。 在任何时候,我们都需要根据数量来告诉前k名的产品 我的做法: 保持一堆大小为k的水貂 维护一个hashmap,其中存储产品id作为键,存储产品数量,存储堆索引作为值 现在收到一个数据,检查hashmap中是否存在产品id 如果hashmap中存在: 更新堆中的产品数量(因为产品数量将增加)。 更新hashmap中的新数量、新索引 如果hashmap中不存在: 检查新产品数量是否大于堆中的最小值 如果大于,则移除堆的根并替换为新值 问题: 我的方法的问题

数据流正在到来。 数据包含产品Id和数量。 在任何时候,我们都需要根据数量来告诉前k名的产品

我的做法:

保持一堆大小为k的水貂 维护一个hashmap,其中存储产品id作为键,存储产品数量,存储堆索引作为值

现在收到一个数据,检查hashmap中是否存在产品id

如果hashmap中存在:

更新堆中的产品数量(因为产品数量将增加)。 更新hashmap中的新数量、新索引

如果hashmap中不存在:

检查新产品数量是否大于堆中的最小值 如果大于,则移除堆的根并替换为新值

问题: 我的方法的问题是,产品ID可以在任何时候重复,因为产品数量会增加。
我应该使用什么方法来存储产品数量和堆索引,因为目前的一些产品可能不在堆中,但将来它们可能是堆的一部分。

如果您有足够的内存来存储所有产品及其计数,那么就维护一个由产品id键控的哈希映射,以及一个树结构(,例如)这是按频率排序的

当更新到来时:

  • 如果产品不在哈希映射中,请将其添加到哈希映射中,并以1的频率将其添加到树中
  • 如果产品已经在哈希映射中,请在树中查找它,增加其频率,并调整节点在树中的位置
向树中添加节点和调整节点位置是O(logn)操作

当您必须按频率获得排名前“k”的产品时,您可以使用树的顺序遍历,当您到达
k
时,可以提前退出


如果你没有内存来存储每个产品的计数,事情会变得有点棘手,你可能不得不使用近似算法。给出了一些想法。

如果您收到的数据中的数量字段是该产品的当前总数量,那么我将坚持您的方案。如果你每次都会收到一个额外的数量,并将其添加到之前收到的数字之上,那么这是一个值得思考的问题。在这两种情况下,我都会使用
productID
作为映射键。每次重复productID时都会收到额外的数量。我在考虑使用TRIE,在trieode中,我可以包括产品数量和heapIndex(-1,如果堆中不存在)。因此,如果在任何给定的时间点,您需要找到前100个元素,维护前10K个元素的堆。因此,如果您的数据分布良好,即数据流没有太多的突增,那么您很有可能对您的前100个数字是正确的。当然,很多产品的数量数字并不准确。