我需要一个类似地图的数据结构(在C ++中),用于存储具有以下功能的对(Key,T):
我不需要
换句话说,您可以构建一些搜索结构,但在任何时候您都可以跳过历史记录,并以不同的方式扩展结构的早期/不同版本。稍后您可以在这些不同版本之间跳转。
在我的项目中,Key和T可能是整数或指针值,但不是字符串。
主要目标是减少时间复杂度;空间消耗是次要的(但也应该是合理的)。为了澄清,对我来说log(N)+ log(S)(其中N个元素数量,S个快照数量)就足够了,虽然速度越快越好:)
我有一些粗略的想法如何实现它 - 例如:作为二元搜索树的结构,插入新元素可以克隆从根到插入位置的路径,同时保留其余的树完好无损。切换树版本等同于选择不同版本的根节点,对于这些版本,某些更改根本不可见。
然而,为了使这种自定义树有效(例如自平衡),需要一些额外的努力和仔细的编码。当然我可以自己做,但也许现有的图书馆可以做到这一点?
此外,我可能根本不知道这种数据结构的正确名称,使我的Google搜索(或SO搜索)完全失败......
感谢您的帮助!
答案 0 :(得分:4)
我认为你要找的是一张不变的地图。功能(或功能启发)编程语言(如Haskell或Scala)具有您在STL中找到的大多数容器的不可变版本。插入/移除等操作然后返回包含您请求的修改的副本的地图副本(保留原件)。在设计数据结构方面已经做了大量工作,以便副本能够指向尽可能多的原始数据结构,以减少每个操作的时间和内存复杂性。
您可以在书中找到更多详细信息,例如:http://www.amazon.co.uk/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504。
答案 1 :(得分:0)
在搜索一些持久性搜索树库时,我偶然发现了这个:
http://cg.scs.carleton.ca/~dana/pbst/
虽然它没有所需的完全相同的功能,但它似乎非常接近它。我会调查。
(在这里张贴,因为有人可能会发现它也很有用)