维护树的版本

时间:2013-11-12 06:31:17

标签: database algorithm data-structures tree

我有一个树数据结构,在特定级别(最大深度为8-9级)有多达1000个节点。

我需要维护整个树的版本。在某些处理发生后创建一个版本。在这些版本之间,节点中的数据可能会发生变化(不超过100左右)。

截至目前,我正在为每个新版本克隆整个树,但在几个版本之后,空间消耗量很大。我无法完全删除以前的版本记录,因为我需要跟踪这些更改。

将这些版本存储在数据库中的最佳方法是什么? (如果不是数据库,任何替代方式)。

5 个答案:

答案 0 :(得分:2)

这不是一个非常简单的问题,但它是一个已解决的问题。通常,记住其历史记录的数据结构称为persistent data structures

链接的维基百科页面有an example of a persistent tree,您应该查看。

path copying approach实现起来相当简单,但效果不尽如人意。

答案 1 :(得分:1)

可能的实际解决方案可能是:

如果您需要恢复旧版本:

  1. 将新树和上一个树序列化为XML。
  2. 使用以前的XML对新XML进行区分,序列化并将差异存储在数据库中 (对于Java解决方案,我发现http://diffxml.sourceforge.net和XMLUnit,但它 必须检查它们是否能够计算新XML之间的差异 和以前的XML,允许从以前的XML轻松恢复 新的XML)。
  3. 每次需要旧版本时,都会先从中获取差异 数据库,从最新到最远,并按此顺序应用它们 (序列化为XML)当前树,以获取旧版本树的XML形式。
  4. 如果您不需要重建旧版本,那么只需使用XMLUnit进行计算 差异并将其序列化存储在数据库中。

答案 2 :(得分:0)

将每个唯一节点永久冻结在一个表中(一旦在其中插入节点,从不编辑或删除它)。如果您需要稍微更改节点,请在表中插入此已修改的节点。然后,使用节点表的外键跟踪树版本。这应该要求每棵树有一些微不足道的空间。

答案 3 :(得分:0)

将每个“版本”存储为更改的节点与旧/新值之间的映射。

您可以通过反转操作序列来重建任何以前的版本。

答案 4 :(得分:0)

由于您关心树的先前版本并且空间是您主要关心的问题,假设从一个版本到另一个版本的treas并不完全不同,您只能存储treas之间的差异。怎么做完全取决于你:   - 你可以对树进行in / pre / post顺序解析(假设它是二进制的)并提出一个逻辑来从差异的位置到另一个    - 或使用链接列表仅存储差异+一些逻辑来重建treas