给定两个文件树A和B,是否可以确定最短操作序列或操作的短序列,以便将A转换为乙
操作可以是:
A和B在相同文件夹结构中具有相同内容(或相同大小相同CRC)和相同名称的相同文件时是相同的。
这个问题让我困惑了一段时间。目前我有以下基本想法:
但是我认为这实际上是一种不理想的方式。你能给我什么建议?
谢谢!
答案 0 :(得分:6)
这个问题是tree edit distance问题的一个特例,找到最佳解决方案(不幸的是)已知是NP难的。这意味着对于一般情况可能没有任何好的,快速的和准确的算法。
那就是说,我链接的论文确实包含了几个很好的讨论,这些讨论的近似算法和算法在问题的限制情况下有效。您可能会发现讨论很有趣,因为它阐明了解决此问题时实际出现的许多问题。
希望这有帮助!并感谢发布一个很棒的问题!
答案 1 :(得分:3)
您可能想要查看树编辑距离算法。我不知道这是否会整齐地映射到您的文件系统,但它可能会给您一些想法。
答案 2 :(得分:1)
要做的第一步是确定需要创建/重命名/删除哪些文件。
哈希映射中遗留的文件是必须创建的文件。在解析目录结构之后,这应该是最后一步。
文件差异解决后,它变得相当棘手。如果没有一个有效的最优解决方案(NP-complete / hard),我不会感到惊讶。
困难在于问题本身并不能自然细分。您执行的每个步骤都必须考虑整个文件树。我会再考虑一下。
编辑:似乎研究最多的树编辑距离算法仅考虑创建/删除节点和重新标记节点。这不能直接适用于这个问题,因为这个问题允许移动整个子树,这使得它变得更加困难。 “更简单”编辑距离问题的当前最快运行时间是O(N^3)
。我想这个运行时间会慢得多。
An Optimal Decomposition Algorithm for Tree Edit Distance - Demaine,Mozes,Weimann
答案 3 :(得分:1)
枚举B中的所有文件及其关联的大小和校验和; 按大小/校验和排序。
枚举A中的所有文件及其关联的大小和校验和; 按大小/校验和排序。
现在,进行有序列表比较,请执行以下操作:
一个。对于A中的每个文件而不是B,删除它。
湾对于B中的每个文件而不是A,创建它。
℃。对于A和B中的每个文件,重命名从A到B遇到的数量,然后在B中复制其余文件。如果要覆盖现有文件,请将其保存在单独列表中。如果在该列表中找到A,请将其用作源文件。
对目录执行相同操作,删除A中的但不在B中,并在B中添加但在A中不添加。
您可以按校验和/大小进行迭代,以确保您永远不必访问文件两次,或者担心删除稍后需要重新同步的文件。我假设你试图保持两个目录同步而不进行不必要的复制?
总体复杂度为O(N log N)加上读取所有这些文件及其元数据所需的时间。
这不是树编辑距离问题;它更像是生成树的列表同步问题。
答案 4 :(得分:0)
只有非常重要的问题是移动文件夹和文件。重命名,删除和创建是微不足道的,可以在第一步完成(或者在完成时更好)。
然后,您可以将此问题转换为问题白名转换树,这些问题包括相同的叶子但不同的拓扑结构。
您决定从某个文件夹/存储区移动哪些文件以及哪些文件将保留在文件夹中。决定基于源和目标中相同文件的数量。
您应用相同的策略在新拓扑中移动文件夹。
如果您忘记文件夹的名称并考虑文件和拓扑,我认为您应该接近最佳或最佳。