对不可变树进行有效的随机更新

Efficient random update on immutable tree

本文关键字:随机 更新 有效 不可变      更新时间:2023-10-16

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

我看了看Zipper结构。据我所知,Zipper专门用于节点的特定位置,如果目标点发生变化,则需要进行重组。会更贵,因为我需要更新随机节点。

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

更新

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

拥有"转发更改列表"怎么样。

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

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

更新:这样的结构似乎已经被发明了。查看Bw Tree