【发布时间】: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