gpt4 book ai didi

c# - 具有 128 位键的基于时间的字典/哈希表,即超时字典中的值

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:27 27 4
gpt4 key购买 nike

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

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

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

背景:

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

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

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

问题:

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

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

此外,是否有某种 .NET 库可以执行类似的操作?

最佳答案

您可以通过使用优先级队列(或仅使用最小堆)和关联的字典来避免定期扫描整个集合。遗憾的是,.NET Framework 不包含优先级队列集合,但有一些可用。我发布了一个simple binary heap不久前。

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

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

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

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

关于c# - 具有 128 位键的基于时间的字典/哈希表,即超时字典中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14470241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com