2

我需要制作一个不会无限增长的基于时间的字典哈希表。

“基于时间”的意思是,如果我要在 X 时间添加一个字典,我希望该项目在 X+Y 时间不存在。Y 为超时时间。

我愿意将时间存储在字典中或作为键或值中的结构。

语境:

我得到了我们正在使用的库调用的“回调”,它为我提供了 4 条信息(时间、键、值、操作类型)。

operationType 可以是 start 或 end (还有其他的,但没关系)。

因此,如果我在 X 之后的 Y 时间段内结束,我很乐意使用这些有用的信息。否则我可以丢弃它。

问题:

这基本上是一个定时器线程,它每隔 Y 间隔清理一次字典,并且主线程不断从回调中将内容添加到这个字典中吗?

我使用 Dictionary 来做到这一点,没有计时器,即使我删除了我能够“加入”的元素,它似乎也在无限增长。

另外,是否有某种 .NET 库可以做这样的事情?

4

1 回答 1

1

您可以通过使用优先级队列(或仅最小堆)和关联的字典来消除定期扫描整个集合的麻烦。不幸的是,.NET Framework 不包含优先级队列集合,但有一些可用。不久前我发布了一个简单的二进制堆

这里的想法是,当您添加一个项目时,您将它添加到字典和堆中。如果你想通过它的键来查找一个项目,你可以在字典中查找它。如果要从堆中删除第一项,请从堆中获取它,然后使用键(它是数据的一部分)将其从字典中删除。

美妙之处在于,您不必扫描整个字典来确定需要删除哪些字典,而是可以查看堆的顶部:

while (heap.Count > 0 && heap.Peek().ExpirationTime < time)
{
    var item = heap.RemoveRoot();
    dictionary.Remove(item.Key);
}

这种方法的主要缺点是它需要更多的内存,因为你有字典条目的开销。

于 2013-01-23T01:32:35.830 回答