C# 中的老化数据结构
Posted
技术标签:
【中文标题】C# 中的老化数据结构【英文标题】:Aging Data Structure in C# 【发布时间】:2010-09-06 03:04:55 【问题描述】:我想要一个允许查询过去 X 分钟内有多少项目的数据结构。一个项目可能只是一个简单的标识符或更复杂的数据结构,最好项目的时间戳将在项目中,而不是存储在外部(作为散列或类似的,不希望有多个项目具有相同的问题时间戳)。
到目前为止,我似乎可以使用 LINQ 轻松过滤时间戳大于给定时间的项目并聚合计数。尽管我对尝试将 .NET 3.5 特定的东西应用到我的生产环境中犹豫不决。对于类似的数据结构,还有其他建议吗?
我感兴趣的另一部分是老化旧数据,如果我只想询问少于 6 小时前的项目计数,我想要比这更旧的任何数据从我的数据结构中删除,因为这可能是一个长时间运行的程序。
【问题讨论】:
【参考方案1】:可以使用一个简单的链表。
基本上你在末尾添加新项目,从一开始就删除太旧的项目,这是一种廉价的数据结构。
示例代码:
list.push_end(new_data)
while list.head.age >= age_limit:
list.pop_head()
如果列表足够繁忙以至于需要一次切掉大于一个的部分,那么我同意dmo,使用树结构或允许更高级别修剪的类似结构。
【讨论】:
【参考方案2】:我认为一个重要的考虑因素是查询与添加/删除的频率。如果您要进行频繁的查询(特别是如果您有大量的集合),那么 B 树可能是您的最佳选择:
http://en.wikipedia.org/wiki/B-tree
您可以让一些线程通过并定期清理此树或使其成为搜索的一部分(同样,取决于使用情况)。基本上,您将进行树搜索以找到“x 分钟前”的位置,然后计算节点上具有较新时间的子节点数。如果你保持节点下的子节点数量是最新的,这个总和可以很快完成。
【讨论】:
【参考方案3】:具有滑动过期的缓存将完成这项工作....
把你的物品塞进去,缓存处理老化....
http://www.sharedcache.com/cms/
【讨论】:
以上是关于C# 中的老化数据结构的主要内容,如果未能解决你的问题,请参考以下文章