按键对ImmutableSortedDictionary范围进行枚举


11

我正在阅读有关C#的内容ImmutableSortedDictionarySystem.Collections.Immutable并在考虑如何在程序中应用它。我非常喜欢C ++的lower_boundupper_bound(请参阅此处),而我更希望看到某种范围查找。但是,文档中似乎缺少类似的方法。我想念什么吗?还是MS真正提供了分类字典,而没有有效访问分类范围?这似乎并不像可以对IEnumerable扩展方法那样对某个键进行某些操作,所以我有点困惑,因为我没有看到集合直接提供的某些功能。


埃里克·利珀特(Eric Lippert)在2008年分享了一个不变的AVL树实现。根据评论,我认为它尚未针对速度或效率进行特别优化,但IBinarySearchTree<K,V>它的实现看起来更接近我的期望。我不知道他是否会进一步修改?
J特拉纳

ImmutableList<T>班也被实现为AVL树。从源代码/// The root node of the AVL tree that stores this set.
Theodor Zoulias

您是否知道这意味着列表使用AVL true来实现不可变性,还是AVL树本身是不可变的?(也许没关系,因为他们无论如何都不暴露树)。
J特拉娜

根据文档,这是ImmutableList<T>(由AVL树支持)相对于ImmutableArray<T>(由数组支持)的优势。使用不可变列表的原因:1)更新数据很普遍,或者元素的数量预计不会很小。2)更新集合比迭代内容更重要。
Theodor Zoulias

这是因为从大型AVL树中添加或删除元素时,通过共享大多数节点并仅创建几个新节点,您可以在不破坏原始树的情况下获得一棵新树。(永久性数据结构-树
Theodor Zoulias

Answers:


9

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

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


2
附带说明一下,另一个不可更改的类ImmutableList<T>内部内部实现为tree。因此它比a慢10倍,分配的内存多12倍List<T>。使用ImmutableArray<T>代替。
Theodor Zoulias

1
呵呵,我已经使用了C5,但希望了解不可变集合(除了快照)可用的东西。谢谢!我要寄希望于其他人已经以某种方式解决了这个问题,但是我要记住ImmutableSortedSet
J Trana

@TheodorZoulias当TryGetValue方法在log(N)中工作时,在SortedDictionary中具有BinarySearch方法有什么意义? 看到这里
Giorgi Chkhikvadze

2
@GiorgiChkhikvadze BinarySearch可以为您提供比您要搜索的项目大的下一个元素,以防万一找不到完全匹配的元素。
Theodor Zoulias

1
@GiorgiChkhikvadze这里最大的区别可能是返回值不仅仅是集合中的单个值,而是一种有效地索引集合中的方式。BinarySearch方法之所以特别,不仅因为它可以高效地找到值,而且还可以在Theodor指出的情况下即使在未命中的情况下也可以找到索引,这可以快速访问例如数组。但是,对于树而言,整数索引可能不是访问结构的有效方法。C ++通过使用迭代器对象(尽管有其自身的复杂性)解决了这一问题。
J特拉纳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.