我正在实现Bentley-Ottman算法,该算法要求扫描线(SL)具有以下属性的数据结构:
- 维护
T
的排序集合,其中T
是IComparable<T>
- 元素的插入应该是
O(log count)
并且应该返回元素是否已经插入 - 元素的删除应该是CCD_ 5
- 对于给定的元素
e
(无论是否已经在集合中),我需要按排序顺序排列在e
旁边的集合的上一个和下一个元素
SortedList<TKey, TValue>
在插入和删除时有一个O(count)
,因为它必须移动列表中的所有连续元素。然而,一旦我知道了e
的索引,我就可以对它进行索引,从而获得O(1)
中的前一个和下一个元素。
SortedDictionary<TKey, TValue>
和SortedSet<T>
有O(log count)
插入和删除,但我找不到任何迭代器来提供下一个和上一个元素。
是否有任何实现可以为我提供完整的功能?
如果没有,实现它的最快方法是什么?LinkedList<T>
不允许二进制搜索。CCD_ 16仍然具有CCD_ 17插入/删除。我真的必须实现我自己的平衡树吗?
例如,c5集合库的TreeDictionary
以及nuget和github具有
如果存在是k的前身,在这种情况下,前身与res有约束力;否则返回false,并将KeyValuePair的默认值绑定到resk的前身是排序字典中具有最大关键字的条目根据密钥比较器,严格小于k。抛出NoSuchItemException如果k不具有前置条目;即没有密钥小于k。
和
bool TrySSuccessor(K K,out KeyValuePair res)如果存在是k的继承人,在这种情况下,继承人对res具有约束力;否则返回false,并将KeyValuePair的默认值绑定到res.继承者of k是排序字典中具有严格大于k。如果k没有抛出NoSuchItemException有继任者;也就是说,字典中没有任何条目的关键字大于
并且应该拥有几乎所有您需要的东西。