Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何同时遍历两个任意复杂的树结构并创建一个超集?_Algorithm_Data Structures_Superset - Fatal编程技术网

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

Algorithm 如何同时遍历两个任意复杂的树结构并创建一个超集?,algorithm,data-structures,superset,Algorithm,Data Structures,Superset,我有两个树结构,它们表示目录结构在两个不同时间点的快照。目录可能已在快照之间添加、删除或修改。我需要同时遍历这两棵树,并用这两棵树之间的差异标记较新的树,即将节点标记为新的、修改的、删除的、未更改的,添加任何已删除的节点,以便最终结果是两个快照的完整超集 通常情况下,这些树可能有10深但非常宽,包含数十万个节点,可能有数百万个节点。我想通过比较每个节点上的哈希代码,跳过大量的树,只在代码不匹配的地方继续递归 有一种算法可以成为我的朋友吗?还有其他建议吗?想象一下,将每棵树展开到文件和目录的排序列

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

通常情况下,这些树可能有10深但非常宽,包含数十万个节点,可能有数百万个节点。我想通过比较每个节点上的哈希代码,跳过大量的树,只在代码不匹配的地方继续递归


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

想象一下,将每棵树展开到文件和目录的排序列表中。一种方法可以从每棵展开的树的一个interator中获取该树的下一个输入。然后,我可以比较散列码,在一棵树或另一棵树上跳过,注意删除和修改。

Lindholm、Kangasharju和Tarkoma撰写的论文《通过序列比对快速简单的XML树差异化》有一些要点:

1) rsync会做你感兴趣的事情。看一看,也许值得检查一下rsync--list是否只执行它听起来的功能

2) 一个技巧是通过深度优先搜索遍历树层次结构,将其转换为序列,然后比较这两个序列。然后可以使用滚动哈希()实现比较哈希代码的想法


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

谢谢您的回答-您介意在diff或xdelta上扩展一下吗?感谢本文在两个方面使用了diff和xdelta:它使用diff和xdelta作为寻找匹配的聪明方法的思想来源,它还使用了匹配两个序列的思想,然后将其转换回生成序列的树。例如,如果从子树A和B生成的拉伸作为序列匹配,则匹配子树A和B。考虑到这一点,我想知道如何从一个序列构建后缀数组,并使用它沿另一个序列移动,在每个点上找到第一个序列中具有最长匹配子序列的点。