【问题标题】:Does C#.NET have any data structure that satisfies the following properties?C#.NET 是否有任何满足以下属性的数据结构?
【发布时间】:2017-01-28 18:42:50
【问题描述】:

我正在尝试解决一个问题,但我意识到我的解决方案的复杂性比预期的要高,因为 Insert for List<T> 是 O(n)(来源:https://msdn.microsoft.com/en-us/library/sey5k5z4(v=vs.110).aspx)。

我想要的是像

这样的数据结构
  • 顺序容器
  • 具有在元素有序时有效的二进制搜索方法
  • 在索引处插入优于 O(n)
  • O(1) 获取容器中元素的数量
  • O(1) 按索引查找

换句话说,我想要像List<T> 这样的东西,除了更快的插入。

【问题讨论】:

  • @MatthewCawley 我认为您不能使用LinkedList<T> 在 O(1) 中按索引访问元素。例如。做不到int median = LL[LL.Count/2];
  • 我不知道这样的数据结构是否存在(听起来有点难以置信),但我猜有更奇怪的事情发生。您可能会在Computer Science 上获得更好的结果,因为这与 .NET 没有太大关系(绝对没有单一的内置集合)。此外,如果您描述需要这些属性的算法,可能会找到替代方案。
  • 您说您需要按索引进行 O(1) 查找,但您的描述表明您实际上是在中间插入元素以保持某种顺序,并且不介意这会改变现有元素。所以这个要求很奇怪。如果您只需要一个容器,该容器可以通过优于 O(n) 的插入来有效地维护已排序的元素,那么SortedSet<T> 可以工作。它不允许重复,但可以通过存储包含 T 和计数的包装器类型来解决此问题,如果元素已经存在,则增加该计数。
  • 在这里听起来像是一个 x-y 问题。你希望解决什么问题?

标签: c# .net algorithm data-structures


【解决方案1】:

它不是完全内置的,但您可以尝试一下。 Wintellect 电源集合有BigList<T> 可以完成这项工作。

https://powercollections.codeplex.com/

List<T> 相比,它在特定索引处的插入速度更快。我不能告诉你它的确切工作方式,但它会在元素周围保留一些偏移量,所以就内存而言,它会更加昂贵。

你也可以找到它作为 nugget 包。

**编辑:**它具有 O(log n) 索引访问权限,因为 @Ryan 已纠正我。

【讨论】:

  • 该库中的 BigList<T> 具有 O(log n) 索引访问,而不是 O(1)。
  • 感谢您的更正,我在 wintellect 中找不到有关数据结构的文档,我已凭记忆回答。你有文档的网址吗,我记得有官方文档吗?
  • 在 XML 注释文档中。 Codeplex 似乎没有行号或不支持链接到行,但在powercollections.codeplex.com/SourceControl/latest#Source/… 中有提及。
  • 感谢您的信息;]
【解决方案2】:

是否有可能在列表中出现重复项,或者您能保证您不会两次看到相同的值吗?您是否需要指定索引,或者您是否希望根据项目的值对事物进行排序?

如果您知道不会有重复项,或者您不想在有重复项时将值存储两次,并且您的索引完全基于根据其值将项目放置在正确的位置,您可以查看SortedSet<T> 类型。

如果可能有重复,但您想手动指定值,您可以查看SortedDictionary<TKey, TValue>,其中TKey 值是您的整数索引。

如果您不能满足其中任何一个条件,那么您将无法实现自己的类型。好消息是您不必从头开始。 LinkedList<T> 类型可以帮助您完成大部分工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多