【问题标题】:Looking for .Net sorted collection with access to previous and next elements寻找可以访问前一个和下一个元素的 .Net 排序集合
【发布时间】:2015-04-20 11:16:06
【问题描述】:

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

  • 维护T的排序集合,其中TIComparable<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


【解决方案1】:

例如c5 collection librarynugetgithubTreeDictionary有一个

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。继任者 k 是排序字典中最小键严格大于的条目 k 根据密钥比较器。如果 k 没有抛出 NoSuchItemException 有继任者;也就是说,字典中的任何条目都没有更大的键 比k。

应该有你需要的几乎所有东西。

【讨论】:

  • 也只是在查看相同的结构。
  • 哇,C5 库真的有很多有用的东西。非常感谢您的指点。
猜你喜欢
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2020-08-11
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多