具有历史记录(持久性)的搜索结构
Search structure with history (persistence)
我需要一个类似映射的数据结构(以C++为单位)来存储具有以下功能的对(Key,T):
- 您可以在当前结构中插入新元素(键,T)
- 您可以根据当前结构中的键搜索元素
- 您可以制作当前版本结构的"快照"
- 您可以切换到拍摄快照的结构版本之一,并从那里继续所有操作
- 完全删除其中一个版本
我不需要什么
- 从结构中移除元素
- 将结构的不同版本合并为一个
- 迭代当前存储在结构中的所有(或部分)元素
换句话说,你可以建立一些搜索结构,但在任何时候你都可以跳转到历史中,并以不同的方式扩展结构的早期/不同版本。稍后,您可以在这些不同版本之间跳转。
在我的项目中,键和 T 可能是整数或指针值,但不是字符串。
主要目标是降低时间复杂度;空间消耗是次要的(但也应该是合理的)。澄清一下,对我来说,log(N)+log(S)(其中N个元素,S个快照)就足够了,尽管越快越好:)
我有一些粗略的想法,例如---实现它:作为二叉搜索树的结构,插入新元素可以克隆从根到插入位置的路径,同时保持树的其余部分完好无损。切换树版本等效于选择根节点的不同版本,对于根节点,某些更改根本不可见。
但是,为了使此自定义树高效(例如自平衡),需要一些额外的努力和仔细的编码。当然,我可以自己做,但也许已经有现有的库可以做到这一点?
此外,这种数据结构可能有一个我根本不知道的专有名称,使我的 Google 搜索(或 SO 搜索)完全失败......
感谢您的帮助!
我认为您正在寻找的是不可变的地图。函数式(或函数式启发的)编程语言(如Haskell或Scala)具有您在STL中找到的大多数容器的不可变版本。插入/删除等操作然后返回地图的副本(保留原始地图),其中包含包含您请求的修改的副本。在设计数据结构方面已经做了大量工作,以便副本能够指向尽可能多的原始数据结构,从而减少每个操作的时间和内存复杂性。
你可以在像这样的一本书中找到更多细节:http://www.amazon.co.uk/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504。
在搜索一些持久的搜索树库时,我偶然发现了这个:
http://cg.scs.carleton.ca/~dana/pbst/
虽然它没有与需要完全相同的功能,但它似乎非常接近它。我会调查的。
(在这里发布,因为有人可能会发现它也很有用)
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 在树结构.txt文件中搜索节点
- 搜索并替换结构向量中的值
- 如何二进制搜索结构向量并在适当的索引处插入
- 在结构向量中搜索一个数据成员,然后打印匹配的所有数据成员
- 用户输入字符串的结构的搜索向量
- 在 c++ 上搜索结构中的对象
- C++ 使用数组结构创建平衡的二叉搜索树
- 如何在结构的“std::list”中搜索
- 在地图中搜索结构元素
- 在树结构中搜索数据
- 用于高效搜索的数据结构
- C++二叉搜索树实现,动态数组或结构/类
- 多种搜索组合的数据结构设计
- 从C++二进制搜索树中删除一个节点(类而非结构)
- 哪种数据结构是在一个向量中搜索和计数对象对的最佳数据结构
- 获取成功的二进制搜索树C 数据结构
- 如何在向量中搜索结构项?
- 具有历史记录(持久性)的搜索结构
- 如何在 C# 中优雅地搜索结构数组,从 C++ 移植