该方案是事件的时间表,我希望能够查询特定日期范围内的所有项目。
我正在寻找.NET中的数据结构(最高v4.0),它将项目存储为已排序且唯一(例如,通过使用比较器或唯一键)。它应该支持在不超过对数复杂度的情况下添加/删除,以及在这种复杂性下执行二进制搜索。
System.Collections.Generic.SortedSet
似乎就像我想要的那样,但它的GetViewBetween()
方法返回一个包含项的列表,作为SortedSet。
我遗漏了两件事:
ToList()
或枚举SortedSet太贵了,因为列表很长。我需要方法返回List<T>
,而不是SortedSet<T>
。如果你知道一个包含这种数据结构的好库,经过测试和熟悉,我肯定会尝试一下。
感谢。
答案 0 :(得分:1)
经过一些阅读后,看起来SortedList或SortedDictionary就是您所需要的。 SortedList似乎使用更少的内存,并且在技术上是二叉树,其中SortedDictionary使用未排序的数据更快。除此之外,他们是非常亲密的表兄弟。
以下是关于差异的好问题/答案:SortedList vs. SortedDictionary vs. Sort()
答案 1 :(得分:1)
我认为问题在于您需要在两个轴上组织数据结构 - 您的唯一键和时间。如果你可以交换空间的时间,我会建议不同的数据结构(包装在你自己的类中以确保一致性)。您可能希望使用SortedList来跟踪面向键的数据。我相信它基于红黑树,应该具有您想要进行键搜索的特性。或者,如果您不需要按键排序,则可以使用简单的词典。
为了支持基于日期的搜索,您可能希望有一个B树(一个实现,请注意我没有测试过它:http://blog.daisley-harrison.com/blog/post/NET-Generic-BTree-Library-and-Source-Code.aspx)按日期键入。但是,请确保它支持重复键,因为这些键可能不是唯一的。它可以包含数据的副本,也可以只包含与该时间戳关联的密钥。
所有这些结构都具有log(n)或更好的搜索复杂性。两个日期之间的项目列表应该非常高效,B-Tree / Dictionary组合将带来最佳性能。