我有一个Node类,它有一个float Distance属性。
我想要一个数据结构,我可以在其中放入所有节点,它们将被存储排序(如在AVL树或红黑树中)。
我试图使用排序字典,但事实证明它完全无用,因为他不能容纳两个具有相同距离的项目。
使用list并排除问题,因为删除是(O(n))并且找到Minimum也是(O(n))
我需要的只是一个简单的通用红黑树结构,它将根据我提供的一些谓词排序(用于比较节点内的距离)
BCL中是否有这样的数据结构?
答案 0 :(得分:4)
您想要使用c5 Collections Library的TreeBag<T>
类。它是一个红黑树,允许重复(因此,包而不是设置)。项目值索引的访问是O(log n);插入和删除是O(log n)摊销。
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。