如何同时走两个任意复杂的树结构并创建一个超集?

时间:2010-01-15 21:59:40

标签: algorithm data-structures superset

我有两个树结构,它们代表两个不同时间点的目录结构的快照。可能已在快照之间添加,删除或修改目录。我需要同时遍历两棵树并用两者之间的差异标记新的 - 即标记节点为New,Modified,Deleted,Unchanged,添加任何已删除的节点,以便最终结果是两个快照的完整超集。

通常,树木可能大约10个深但非常宽,包含数十万个,可能有数百万个节点。我希望通过比较每个节点的哈希码来跳过大块的树,并且只继续递归代码不匹配的位置。

是否有算法可以成为我的朋友?还有其他建议吗?

2 个答案:

答案 0 :(得分:1)

想象一下,将每个树展开到一个已排序的文件和目录列表中。方法可以从该树的交互器获得每个展开的树的下一个输入。然后我可以比较哈希码并在一棵树或另一棵树上向前跳,记下删除,并注意修改。

答案 1 :(得分:1)

Lindholm,Kangasharju和Tarkoma撰写的“通过序列比对快速简单的XML树差异”的论文有一些指示:

1)rsync做了你感兴趣的事情。看看http://samba.anu.edu.au/ftp/rsync/rsync.html,可能值得检查rsync --list-only是否听起来像。

2)一个技巧是将树层次结构转换为序列,通过深度优先搜索遍历它,然后比较两个序列。然后,您可以使用滚动哈希(http://en.wikipedia.org/wiki/Rolling_hash)来实现关于比较哈希码的想法。

我怀疑你最终会生成两个完整的序列,然后在它们之间运行一些等效的diff或xdelta,而不是试图逐步完成工作。当一些子目录在树结构中移动很长时,完全增量的方法可能会出现问题。