寻找.Net排序集合,可以访问上一个和下一个元素

时间:2015-04-20 11:16:06

标签: c# .net sorting data-structures sortedcollection

我正在实施Bentley-Ottman algorithm,这需要扫描线(SL)具有以下属性的数据结构:

  • 维护已排序的T集合,其中TIComparable<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)插入/删除。我真的必须实现自己的平衡树吗?

1 个答案:

答案 0 :(得分:4)

例如c5 collection librarynuget以及githubTreeDictionary

  

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。

并且几乎应该有你需要的一切。