我有一个树数据结构,在特定级别(最大深度为8-9级)有多达1000个节点。
我需要维护整个树的版本。在某些处理发生后创建一个版本。在这些版本之间,节点中的数据可能会发生变化(不超过100左右)。
截至目前,我正在为每个新版本克隆整个树,但在几个版本之后,空间消耗量很大。我无法完全删除以前的版本记录,因为我需要跟踪这些更改。
将这些版本存储在数据库中的最佳方法是什么? (如果不是数据库,任何替代方式)。
答案 0 :(得分:2)
这不是一个非常简单的问题,但它是一个已解决的问题。通常,记住其历史记录的数据结构称为persistent data structures。
链接的维基百科页面有an example of a persistent tree,您应该查看。
path copying approach实现起来相当简单,但效果不尽如人意。
答案 1 :(得分:1)
可能的实际解决方案可能是:
如果您需要恢复旧版本:
如果您不需要重建旧版本,那么只需使用XMLUnit进行计算 差异并将其序列化存储在数据库中。
答案 2 :(得分:0)
将每个唯一节点永久冻结在一个表中(一旦在其中插入节点,从不编辑或删除它)。如果您需要稍微更改节点,请在表中插入此已修改的节点。然后,使用节点表的外键跟踪树版本。这应该要求每棵树有一些微不足道的空间。
答案 3 :(得分:0)
将每个“版本”存储为更改的节点与旧/新值之间的映射。
您可以通过反转操作序列来重建任何以前的版本。
答案 4 :(得分:0)
由于您关心树的先前版本并且空间是您主要关心的问题,假设从一个版本到另一个版本的treas并不完全不同,您只能存储treas之间的差异。怎么做完全取决于你: - 你可以对树进行in / pre / post顺序解析(假设它是二进制的)并提出一个逻辑来从差异的位置到另一个 - 或使用链接列表仅存储差异+一些逻辑来重建treas