【问题标题】:ImmutableSortedDictionary range enumeration by keyImmutableSortedDictionary 按键范围枚举
【发布时间】:2019-11-07 05:32:31
【问题描述】:

我正在阅读 System.Collections.Immutable 中的 C# 的 ImmutableSortedDictionary 并考虑如何在我的程序中应用它。我非常喜欢 C++ 的 lower_boundupper_bound(请参阅 here),我更期待看到类似的范围查找。但是,类似的方法seem to be strangely absent from the documentation。我错过了什么吗?或者 MS 是否真的提供了一个排序字典而没有对排序范围的有效访问?这似乎不像一个可以在键的IEnumerable 上做的事情,比如扩展方法,所以我有点困惑,我没有看到集合直接提供的东西。

【问题讨论】:

  • Eric Lippert 早在 2008 年就分享了一个 immutable AVL tree implementation。从 cmets 来看,我认为它尚未针对速度或效率进行特别优化,但它实现的 IBinarySearchTree<K,V> 看起来更接近于我会期望。我想知道他是否曾经对它进行过进一步的修补?
  • ImmutableList<T> 类也实现为 AVL 树。来自source code/// The root node of the AVL tree that stores this set.
  • 你知道他们的意思是列表使用 AVL true 来实现不变性还是 AVL 树本身是不可变的? (也许没关系,因为它们无论如何都不会暴露树)。
  • 根据documentation,以下是ImmutableList<T>(由AVL 树支持)相对于ImmutableArray<T>(由数组支持)的优势。 使用不可变列表的原因: 1) 更新数据很常见,或者元素的数量预计不会少。 2) 更新集合比迭代内容更重要。
  • 这是因为在大型 AVL 树中添加或删除元素时,您可以通过共享大部分节点并仅创建少数新节点来获得新树而不会破坏原始树。 (Persistent data structure - Trees)

标签: c# .net algorithm immutability immutable-collections


【解决方案1】:

令人恼火的是,可用的内置集合没有提供完整的功能集(例如 SortedDictionary 缺少 BinarySearch 方法),迫使我们搜索第三方解决方案(例如 C5 library )。

在您的情况下,您可以使用ImmutableSortedSet 而不是ImmutableSortedDictionary,将值嵌入键中并使用适当的比较器。至少这个类的API包含属性MinMax

【讨论】:

  • 附带说明,另一个不可变类 ImmutableList<T> 在内部实现 as a tree。所以它比List<T>慢10倍,分配的内存是List<T>的12倍。请改用ImmutableArray<T>
  • 呵呵,我已经在使用 C5,但想看看哪些内容可用于不可变集合(除了快照)。谢谢!我希望其他人以某种形式或形式解决了这个问题,但我会记住ImmutableSortedSet
  • @TheodorZoulias 当 TryGetValue 方法在 log(N) 中工作时,在 SortedDictionary 中使用 BinarySearch 方法有什么意义? see here
  • @GiorgiChkhikvadze 这里最大的区别可能是返回值不仅仅是集合中的单个值,而是一种有效地索引到集合中的方法。 BinarySearch 方法之所以特别,不仅因为它可以有效地找到值,而且因为它即使在未命中的情况下也能找到索引,正如 Theodor 指出的那样——这允许快速访问例如数组。但是,在树的情况下,整数索引可能不是访问结构的有效方法; C++ 通过使用迭代器对象(尽管有其自身的复杂性)解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2018-08-06
相关资源
最近更新 更多