我想在磁盘文件中保存Btree(不确定二进制文件)。 然后将其读入内存。 某些Level-order遍历可能是二进制Btree的好方法。 但如果它不是二元的那个。 我将叶子节点中的Btree构建到内存中的rootnode。 我相信我必须在磁盘文件中定义一些结构并输出树节点。 使用一些额外的标签来识别文件中的节点? 如何遍历可能是这里的关键问题。 我不知道保存节点和指针的好方法。 然后阅读它。在记忆中构建树。 有什么好主意吗? 非常感谢。
答案 0 :(得分:5)
如果你真的想做类似的事情,你可以在每个节点分配一个id并以这种格式保存节点:
[node-id value left-node-id right-node-id]
然后使用广度优先搜索访问树。
如果要重建树,请创建一个地图id->节点,然后读取向后文件:因此,当您读取记录时,创建节点,将其注册到地图并指定左右节点从地图中获取节点。
答案 1 :(得分:5)
B-Trees的常用技术是确保节点的大小等于磁盘的块大小,并mmap磁盘文件。您没有指定您正在使用的编程语言,因此它可能像C中的强制转换一样简单,或者更复杂的东西,例如创建flyweight对象来包装java.nio.IntBuffer。无论哪种方式,B树的许多优点是你不必一次加载它,但可以相当有效地跳转它。
答案 2 :(得分:0)
对于每个节点定义一些数据结构,它将为您保留节点具有的相同信息,并添加到该结构附加字段,该字段将标记下一个子文件中的偏移量。并将该结构的顶部字段设为实际尺寸,因为您不知道现在正在寻找什么样的树。现在通过跳过文件,您将能够重建您的树。 我确信我的解决方案不是最终的,但我希望它对你来说可能是一个很好的明星点。
答案 3 :(得分:-4)
您可能想查看Protocol Buffers。它们是紧凑的,二进制的,可扩展的,易于读写,并且可以用C ++,Java和Python(以及其他语言的第三方实现)。
您可以为BTree节点定义协议缓冲区消息,并为子节点提供文件偏移量,并以明显的方式将其序列化为磁盘。