【问题标题】:Why does ImmutableList have complexity O(logN) in its add method?为什么 ImmutableList 的 add 方法复杂度为 O(logN)?
【发布时间】:2016-05-18 15:37:05
【问题描述】:

我认为创建了一个包含 N+1 个项目的新 ImmutableList。因此它的复杂度应该是 O(N)。

【问题讨论】:

  • 好吧,他们决定让它比简单的实现更高效。这有什么问题?
  • 您认为创建了一个包含更多项目的全新列表是不正确的。请记住,不可变意味着您可以安全地重用部分现有结构来构建新结构。这种重复使用在许多情况下都可以提高效率。
  • 如果您想了解更多关于高效纯函数数据结构的信息,我建议您看看 Chris Okasaki 的书。

标签: c# immutable-collections


【解决方案1】:

ImmutableList 有 O(log n) 复杂度的原因解释here

为什么不可变类型更容易出现可变的 O(log n) 时间 类型是 O(1)?这是内部数据结构的结果 允许跨集合实例共享。例如一个 mutable HashSet 分配单个数组,并将元素存储在 该数组位于由其哈希码确定的索引处。这个提供者 O(1) 查找和存储时间。如果 ImmutableHashSet 使用了这个 相同类型的数据存储,那么每个突变都需要 重新分配和复制整个数组只是为了更改一个条目, 这将迅速降低性能和 GC 压力,因为 收藏变得越来越大。相反,这些不可变集合使用 不可变平衡二叉树来存储它们的数据,允许非常 跨集合变异实例的高效数据共享。作为 然而,结果是每次查找或更改都需要树遍历 它的算法复杂度(在最坏的情况下)为 O(log n)。

MSDN documentation for ImmutableArray 提供了一些见解并显示了 ImmutableArray 和 ImmutableList 之间的复杂性差异:

【讨论】:

  • 该文档位于ImmutableList<T>.Builder.ToImmutable(),这不是正在讨论的方法。
  • 删除了无效链接。我会尝试从 MSDN 文档中寻找另一个。
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 2023-04-01
  • 2018-08-05
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多