我正在实施Bentley-Ottman algorithm,这需要扫描线(SL)具有以下属性的数据结构:
T
集合,其中T
为IComparable<T>
,O(log count)
,并且应返回元素是否已插入O(log count)
,e
(无论是否已在集合中)我需要排序顺序中e
旁边的集合的上一个和下一个元素。 SortedList<TKey, TValue>
在插入和删除时有O(count)
,因为它必须移动列表中的所有连续元素。但是,一旦我知道O(1)
的索引,我就可以为它编制索引,从而得到e
中的上一个和下一个元素。
SortedDictionary<TKey, TValue>
和SortedSet<T>
有O(log count)
插入和删除,但我找不到任何给我下一个和前一个元素的迭代器。
是否有任何实现可以提供全部功能?
如果没有,那么实施它的最快方法是什么? LinkedList<T>
不允许二进制搜索。 List<T>
仍有O(count)
插入/删除。我真的必须实现自己的平衡树吗?
答案 0 :(得分:4)
例如c5 collection library和nuget以及github的TreeDictionary
有
bool TryPredecessor(K k,out KeyValuePair res)如果有则返回true 是k的先行者,在这种情况下将前任绑定到res;除此以外 返回false并将KeyValuePair的默认值绑定到res。该 k的前身是具有最大密钥的排序字典中的条目 根据密钥比较器严格小于k。抛出NoSuchItemException 如果k没有前任条目;也就是说,没有键小于k。
和
bool TrySuccessor(K k,out KeyValuePair res)如果有则返回true 是k的继承者,在这种情况下将继承者与res联系起来;否则返回 false并将KeyValuePair的默认值绑定到res。继任者 of k是排序字典中的条目,其中最小密钥严格大于 k根据密钥比较器。如果k没有,则抛出NoSuchItemException 有继任者;也就是说,字典中没有条目具有更大的键 比k。
并且几乎应该有你需要的一切。