【问题标题】:Approximate Edit distance tree - Exact Edit path近似编辑距离树 - 精确编辑路径
【发布时间】:2013-10-31 20:57:44
【问题描述】:

我一直在寻找一种算法来有效地计算两棵树之间的编辑路径,该路径不必对应于最短编辑距离,但最好是相对较短的。

情况是我有两个目录树,由目录和文件组成,并且想要计算一系列删除、插入和重命名,从而将一个转换为另一个。

我曾尝试搜索 * 和 wild web,但我发现的只是计算最短编辑距离的算法,但它们都有很高的缩放因子。

所以我的问题是,当我不需要最佳距离时,有没有比“张和莎莎”更有效的方法?

亲切的问候

【问题讨论】:

  • 您可以试探性地假设,只要每棵树的根目录中存在同名的文件/目录,它们就会相互对应。递归负责树的其余部分。您可以通过排序然后合并在 O(nlog n) 时间内在两个目录之间找到匹配的文件名,因此在最坏的情况下,这将是 O(nlog n) 整体,其中每棵树仅包含一个根目录,其中包含 n 个文件。
  • 谢谢,但是,如果我理解正确,这意味着移动(重命名)的目录将被视为删除和新的插入,如果它有很大的操作我想考虑非常昂贵内的文件。
  • 没错。我的建议是使用这种方法尽可能多地抓住低垂的果实,然后在更难的情况下使用更好的算法。顺便说一句,在评论中写上@j_random_hacker(或任何用户名)以通知该人。
  • Robinson-Foulds 指标可能不是您想要的,但与此相关的是:en.wikipedia.org/wiki/Robinson-Foulds_metric
  • 不客气。另一个可能减轻重命名的想法:对于您尚未与另一棵树完全匹配的每个底层目录(即没有子目录的每个目录),计算它们包含的每个文件的哈希值(例如 MD5)。现在,您可以通过排序和合并哈希(而不是文件名)在这些目录中找到匹配的文件。之后,您可以通过散列文件的哈希值来计算这些目录本身的哈希值,然后散列其父目录中的其他文件,并在父目录上重复。 IOW 使用后序(自下而上)DFS 来计算哈希。

标签: algorithm tree directory graph-algorithm


【解决方案1】:

Klein algorithm 的性能略好于“张和萨沙”,但在实际应用中,它在空间和时间上仍然具有很高的复杂性。

有一种算法here 实际上是一种启发式算法,因为作者误用了approximation 一词。 它将问题简化为一系列最大加权团,其中存在几种近似和启发式方法,即使是贪婪的方法也可以在这里表现得相当好。

适用于图表的内容适用于树,因此您可以使用graph kernel convolution approach

如果您正在寻找现成的实现(未指定的算法,我猜是 Zhang 或 Klein),您可以查看here

【讨论】: