我需要制作一个基于时间的字典哈希表,其大小不会无限增长。
我所说的“基于时间”具体是指,如果我要在 X 时间添加字典,我希望该项目在 X+Y 时间不存在。 Y 是超时时间。
我愿意将时间存储在字典中或作为键或值的结构。
CONTEXT:
我收到我们正在使用的库调用的“回调”,它为我提供了 4 条信息(时间、键、值、操作类型)。
operationType 可以是 start 或 end(还有其他的,但这并不重要)。
因此,如果我在 X 之后的 Y 时间段内结束,我很乐意使用这些有用的信息。否则我可以丢弃它。
问题:
这基本上是一个计时器线程,每隔 Y 间隔清理一次字典,并且主线程不断从回调中向该字典添加内容?
我使用字典来做到这一点,没有计时器,即使我删除了能够“加入”的元素,它似乎也在无限增长。
另外,是否有某种 .NET 库可以执行类似的操作?
通过使用优先级队列(或只是最小堆)和关联的字典,您可以消除定期扫描整个集合的必要。不幸的是,.NET Framework 不包含优先级队列集合,但有一些可用。我发表了一个一会儿回来。
这里的想法是,当您添加一个项目时,您将其添加到字典和堆中。如果您想通过键查找某个项目,可以在字典中查找。如果要从堆中删除第一项,可以从堆中获取它,然后使用键(数据的一部分)将其从字典中删除。
美妙之处在于,您不必扫描整个字典来确定需要删除哪些字典,而是可以查看堆的顶部:
while (heap.Count > 0 && heap.Peek().ExpirationTime < time)
{
var item = heap.RemoveRoot();
dictionary.Remove(item.Key);
}
这种方法的主要缺点是它需要更多的内存,因为你有字典条目的开销。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)