我正在实现Bentley-Ottman 算法,该算法需要扫描线 (SL) 具有以下属性的数据结构:
- 维护一个排序的集合
T
,其中T
是IComparable<T>
, - 元素的插入应该是
O(log count)
,并且应该返回元素是否已经插入, - 删除元素应该是
O(log count)
, - 对于给定的元素
e
(无论是否已经在集合中),我需要e
在排序顺序旁边的集合的上一个和下一个元素。
SortedList<TKey, TValue>
有一个O(count)
at 插入和删除,因为它必须移动列表中的所有连续元素。但是,我可以索引它,因此O(1)
一旦我知道e
.
SortedDictionary<TKey, TValue>
并且SortedSet<T>
有O(log count)
插入和删除,但我找不到任何给我下一个和前一个元素的迭代器。
是否有任何实现可以为我提供全部功能?
如果没有,实现它的最快方法是什么?LinkedList<T>
不允许二分查找。List<T>
仍然有O(count)
插入/删除。我真的必须实现自己的平衡树吗?