“有限内存映射”的数据结构

时间:2016-04-07 11:53:40

标签: memory data-structures hashmap

我想实现一个关联集合,将键K映射到值V.我还想将每个值V与权重相关联,所以我们有Map [K→(V,Double)]。

现在的想法是拥有此集合的有限内存版本,该版本仅存储超过权重阈值t的元素。每次将元素e插入到该集合中,我们将e的权重增加一定量,例如, 1,并通过一些衰减因子衰减所有其他元素e'!= e的权重,比如说0.0001。 这可确保此集合中的元素为a。 最近,或b。 频繁

当然,可以实现这种数据结构的简单版本,其主动执行衰减操作,并检查所有元素的阈值t的声音。那将是非常低效的。

我想知道是否已经有一个数据结构正是如此。也许有一个相关的数据结构,我可以用它来实现我的要求。感谢投入。

1 个答案:

答案 0 :(得分:1)

这听起来像是LFU(最不常用)缓存驱逐策略的变体,其中驱逐的决定考虑了基于更新的相对比例的附加阈值。

在插入时,您不一定需要主动衰减所有其他条目 - 只保留所有元素的插入总数,以便您可以通过评估是否超过该点的阈值来计算是否保留特定的驱逐候选。

在不使用权重的情况下,稍微不同的方法是将密钥按时间存储在存储桶中,其中值查找的键是在特定存储桶的上下文中完成的。

  • 每个存储桶都有一个关联的时间范围,在该范围内可以将值插入存储桶。
  • 每个存储桶内部都有K -> V地图。
  • 将保留K -> Bucket的其他地图。
  • 将铲斗插入有序列表中。

插入数据结构将:

  • 如果现在超出最近一个存储桶的有效时间范围,则分配新的当前存储桶。
  • 检查存储桶中是否已存在K
  • 如果没有,请将K -> V插入当前存储桶,将K -> current插入存储桶映射关键字。
  • 如果它存在于当前(最近的)存储桶中,则不执行任何操作。
  • 如果它存在于较旧的存储桶中,请将其移至当前存储桶并更新存储桶映射。

最近使用的东西进入了最近的存储桶。事情并没有结束在旧桶中。你会定期清除旧水桶。

缺点是使用时间来衰减,尽管你可能会在桶级使用上面描述的方法,因此由于桶数量少于集合中的项目而导致成本降低到可接受的水平。