c++ - 不可变树的高效随机更新

标签 c++ data-structures immutability

我正在使用 C++ 中的不可变树结构制作可撤销的数据结构。通过共享未更改的子节点,我可以非常有效地派生出新的不可变树。在创建撤消快照时实际上比可变树更有效。但是,我仍然需要重新创建从根到更新目标的所有节点。这是负担得起的,但我想做得更好。

我看了Zipper结构。据我了解,Zipper是专门针对节点的特定位置的,如果目标点发生变化,则需要重构。会更昂贵,因为我需要更新随机节点。

什么样的结构可以满足我的需求?不可变树的更有效随机更新。

更新

正如@SB 提到的,具有反向操作的可变结构会满足我的需求,但由于调试难度和保持反向操作的正确性,我想避免可变结构。所以我不再寻找可变方法。

最佳答案

“更改转发列表”如何?

因此,当您想要修改树时,您只需将操作附加到“更改列表”,而无需修改树。定期将“更改列表”中的整组更改应用于树并创建新的树快照。这只有在每次遍历树时都可以考虑到“更改列表”中的更改时才有可能。大多数情况下,“撤消”只是从“更改列表”中删除项目。

不知道你在用树做什么,很难说这种方法是否有意义。

更新:看来这种结构已经被发明出来了。看看Bw Tree

关于c++ - 不可变树的高效随机更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936869/

相关文章:

c - 我需要帮助在 C 中从中缀转换为后缀

c++ - 错误 : Infinite-loop when loading elements into vector

java - 如何选择合适的 Java 数据结构来模拟 1-n 关系映射?

immutability - 了解 Julia 中具有可变类型字段的不可变复合类型

clojure - 为什么 CouchDB 使用仅追加的 B+ 树而不是 HAMT

c++ - 从文本文件 C++ 加载结构 vector 的奇怪问题

c++ - 更有效的 vector 比较

c++ - 重载方法未在强制转换运算符重载中调用

c++ - 使用 Gtest 如何在 ON_CALL 中返回不同的值?

c# - 只读是否有任何运行时开销?