C# C语言中的老化数据结构#
我想要一个数据结构,允许查询最近X分钟内有多少项。一个项目可能只是一个简单的标识符或更复杂的数据结构,最好是项目的时间戳将在项目中,而不是存储在项目外部(作为散列或类似内容,不希望多个项目具有相同的时间戳) 到目前为止,似乎使用LINQ I可以轻松地过滤时间戳大于给定时间的项并聚合计数。尽管我还不太确定是否尝试将.NET3.5特定的东西应用到我的生产环境中。对于类似的数据结构还有其他建议吗C# C语言中的老化数据结构#,c#,linq,.net-3.5,data-structures,C#,Linq,.net 3.5,Data Structures,我想要一个数据结构,允许查询最近X分钟内有多少项。一个项目可能只是一个简单的标识符或更复杂的数据结构,最好是项目的时间戳将在项目中,而不是存储在项目外部(作为散列或类似内容,不希望多个项目具有相同的时间戳) 到目前为止,似乎使用LINQ I可以轻松地过滤时间戳大于给定时间的项并聚合计数。尽管我还不太确定是否尝试将.NET3.5特定的东西应用到我的生产环境中。对于类似的数据结构还有其他建议吗 我感兴趣的另一部分是老化旧数据,如果我只想在不到6小时前查询项目的数量,我希望从我的数据结构中删除任何比这
我感兴趣的另一部分是老化旧数据,如果我只想在不到6小时前查询项目的数量,我希望从我的数据结构中删除任何比这更早的项目,因为这可能是一个长期运行的程序。我认为一个重要的考虑因素是查询与添加/删除的频率。如果您经常进行查询(特别是如果您有大量的集合),B-树可能是一种方法:
您可以让一些线程遍历并定期清理此树,或者将其作为搜索的一部分(同样,这取决于使用情况)。基本上,您将执行树搜索以查找“x分钟前”的位置,然后计算节点上更新时间的子节点数。如果将节点下的子节点数保持为最新,则可以快速完成此总和。可以使用一个简单的链接列表来完成此操作 基本上,您可以在末尾添加新项,并从一开始就删除太旧的项,这是一种廉价的数据结构 示例代码:
list.push_end(new_data)
while list.head.age >= age_limit:
list.pop_head()
如果列表很忙,需要一次切掉比一个更大的部分,那么我同意,使用树结构或类似的结构,允许在更高的级别上进行修剪。具有滑动过期的缓存可以完成这项工作 将您的项目放入缓存,缓存将处理老化