我应该在C#中选择哪个通用集合来维护已排序的“列表”

时间:2013-04-17 21:24:57

标签: c# .net sorting generic-collections

我有一个Node类,它有一个float Distance属性。

我想要一个数据结构,我可以在其中放入所有节点,它们将被存储排序(如在AVL树或红黑树中)。

  • 我想插入O(log(n))
  • 我想检索并删除O(log(n))
  • 中的最小值

我试图使用排序字典,但事实证明它完全无用,因为他不能容纳两个具有相同距离的项目。

使用list并排除问题,因为删除是(O(n))并且找到Minimum也是(O(n))

我需要的只是一个简单的通用红黑树结构,它将根据我提供的一些谓词排序(用于比较节点内的距离)

BCL中是否有这样的数据结构?

3 个答案:

答案 0 :(得分:4)

您想要使用c5 Collections Library的TreeBag<T>类。它是一个红黑树,允许重复(因此,而不是设置)。项目值索引的访问是O(log n);插入和删除是O(log n)摊销。

C5馆藏图书馆由微软资助;它是开源的,可用免费。价格合适。

http://www.itu.dk/research/c5/

答案 1 :(得分:3)

实际上,您可以使用SortedDictionary。但是你需要的(假设距离是int)是SortedDictionary<int, List<Item>>

如果要添加尚未在字典中的距离,请插入包含单个项目的新List。如果要添加已在字典中的距离,请找到正确的列表并将项目添加到其中。

要删除最小的项目,请找到具有最小键的List并从中删除项目。如果List变空,请将其从字典中删除。

由于从List开始删除效率低下,您需要从List的末尾删除(导致具有相同密钥的项目的LIFO订单),或者使用Queue代替List

这可能不是最有效的解决方案,但插入,查找最小项目和删除最小项目都是O(log n)。

答案 2 :(得分:2)

另一个选项是skip list。 .NET Framework没有,但我在C#中实现了一个。请参阅A More Memory-Efficient Skip List

跳过列表包含O(log n)插入,搜索和删除,以及O(1)删除顶部项目。

如果您想要一个堆,请参阅A Generic Binary Heap Class