6

我正在寻找一个合适的 C# 不可变字典,具有快速更新方法(创建字典的部分副本并稍作更改)。我自己实现了一个,使用 zippers 更新红黑树,但速度不是特别快。

我所说的“不可变字典”不仅仅指只读或常量。我想要一些具有相当快的“With”和“Without”或等效方法的东西,这些方法可以在不修改原始文件的情况下返回稍作修改的东西。

另一种语言的例子是Scala 中的 map

4

1 回答 1

1

有一些基于只读二叉 AVL 树的不可变字典的实现。

/**
 * To modify, use the InsertIntoNew and RemoveFromNew methods
 * which return a new instance with minimal changes (about Log C),
 * so this is an efficient way to make changes without having
 * to copy the entire data structure.
 */

请看一下InsertIntoNew()方法:

/** Return a new tree with the key-value pair inserted
 * If the key is already present, it replaces the value
 * This operation is O(Log N) where N is the number of keys
 */
public ImmutableDictionary<K,V> InsertIntoNew(K key, V val)
{ ... }

RemoveFromNew()方法:

/** Try to remove the key, and return the resulting Dict
 * if the key is not found, old_node is Empty, else old_node is the Dict
 * with matching Key
 */
public ImmutableDictionary<K,V> RemoveFromNew(K key, out ImmutableDictionary<K,V> old_node)
{ ... }

此外,还有另一种实现:C# 中的不可变 AVL 树。它具有相同的 O(log N) 查找和插入时间。

其他参考资料

于 2012-09-14T20:05:38.680 回答