【发布时间】:2015-04-20 11:16:06
【问题描述】:
我正在实现Bentley-Ottman algorithm,它需要扫描线 (SL) 具有以下属性的数据结构:
- 维护
T的排序集合,其中T是IComparable<T>, - 元素的插入应该是
O(log count),并且应该返回元素是否已经插入, - 删除的元素应该是
O(log count), - 对于给定元素
e(无论是否已在集合中),我需要按排序顺序在e旁边的集合的上一个和下一个元素。
SortedList<TKey, TValue> 在插入和删除时有一个O(count),因为它必须移动列表中的所有连续元素。但是,我可以索引它,因此一旦我知道e 的索引,就可以获取O(1) 中的前一个和下一个元素。
SortedDictionary<TKey, TValue> 和 SortedSet<T> 具有 O(log count) 插入和删除功能,但我找不到任何迭代器可以提供下一个和上一个元素。
是否有任何实现可以为我提供全部功能?
如果没有,最快的实现方法是什么? LinkedList<T> 不允许二进制搜索。 List<T> 仍然有 O(count) 插入/删除。我真的必须实现自己的平衡树吗?
【问题讨论】:
-
你想要一个树状集合。 .NET 中没有预定义的树状集合
-
SortedDictionary<TKey, TValue>实际上是一个树状集合 (stackoverflow.com/questions/935621/…)。而且我不会将搜索范围缩小到内置的 .Net 类型。我查看了 Wintellect PowerCollections,但我也无法访问上一个和下一个。
标签: c# .net sorting data-structures sortedcollection