.NET中的数据结构,用于存储按排序唯一且可按范围查询的项目(并且不是SortedSet)

时间:2012-03-11 18:07:24

标签: c# .net data-structures sortedset

该方案是事件的时间表,我希望能够查询特定日期范围内的所有项目。

我正在寻找.NET中的数据结构(最高v4.0),它将项目存储为已排序且唯一(例如,通过使用比较器或唯一键)。它应该支持在不超过对数复杂度的情况下添加/删除,以及在这种复杂性下执行二进制搜索。

System.Collections.Generic.SortedSet似乎就像我想要的那样,但它的GetViewBetween()方法返回一个包含项的列表,作为SortedSet。

我遗漏了两件事:

  1. 调用ToList()或枚举SortedSet太贵了,因为列表很长。我需要方法返回List<T>,而不是SortedSet<T>
  2. 根据我的选择使用包容性/独家日期范围调用它 - 不可能,我也需要它。
  3. 如果你知道一个包含这种数据结构的好库,经过测试和熟悉,我肯定会尝试一下。

    感谢。

2 个答案:

答案 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组合将带来最佳性能。