最短的操作序列,将文件树转换为另一个文件树

时间:2011-08-01 19:43:28

标签: algorithm edit-distance filetree

给定两个文件树A和B,是否可以确定最短操作序列操作的短序列,以便将A转换为乙

操作可以是:

  1. 创建一个新的空文件夹
  2. 创建包含任何内容的新文件
  3. 删除文件
  4. 删除空文件夹
  5. 重命名文件
  6. 重命名文件夹
  7. 在另一个现有文件夹中移动文件
  8. 在另一个现有文件夹中移动文件夹
  9. A和B在相同文件夹结构中具有相同内容(或相同大小相同CRC)和相同名称的相同文件时是相同的。

    这个问题让我困惑了一段时间。目前我有以下基本想法:

    • 计算数据库:
      • 存储文件名及其CRC
      • 然后,查找没有子文件夹的所有文件夹,并从它们包含的文件的CRC中计算CRC,并根据它们包含的文件的总大小计算大小
      • 升级树以为每个父文件夹生成CRC
    • 使用以下具有数据库A和数据库B的循环:
      • 计算A∩B并从两个数据库中删除此交集。
      • 使用内部联接在A和B中查找匹配的CRC,首先按文件夹desc排序
      • 当有结果时,使用第一个结果使文件夹或文件移动(如果需要可能创建新文件夹),从两个数据库中删除结果的源行。如果有移动,则在db A中更新新位置的父文件夹的CRC。
      • 然后删除数据库A中引用的所有文件和文件夹,并创建数据库B中引用的文件和文件夹。

    但是我认为这实际上是一种不理想的方式。你能给我什么建议?

    谢谢!

5 个答案:

答案 0 :(得分:6)

这个问题是tree edit distance问题的一个特例,找到最佳解决方案(不幸的是)已知是NP难的。这意味着对于一般情况可能没有任何好的,快速的和准确的算法。

那就是说,我链接的论文确实包含了几个很好的讨论,这些讨论的近似算法和算法在问题的限制情况下有效。您可能会发现讨论很有趣,因为它阐明了解决此问题时实际出现的许多问题。

希望这有帮助!并感谢发布一个很棒的问题!

答案 1 :(得分:3)

您可能想要查看树编辑距离算法。我不知道这是否会整齐地映射到您的文件系统,但它可能会给您一些想法。

https://github.com/irskep/sleepytree(代码和论文)

答案 2 :(得分:1)

要做的第一步是确定需要创建/重命名/删除哪些文件。

  • A)创建Tree A
  • 文件的哈希映射
  • B)浏览Tree B
  • 的文件
  • B.1)如果哈希映射中有相同的(名称和内容)文件,请不要管它
  • B.2)如果内容相同但名称不同,请将文件重命名为哈希映射中的文件
  • B.3)如果哈希映射中不存在文件内容,请将其删除
  • B.4)(如果1,2,3中的一个为真)从哈希映射中删除文件

哈希映射中遗留的文件是必须创建的文件。在解析目录结构之后,这应该是最后一步。

文件差异解决后,它变得相当棘手。如果没有一个有效的最优解决方案(NP-complete / hard),我不会感到惊讶。

困难在于问题本身并不能自然细分。您执行的每个步骤都必须考虑整个文件树。我会再考虑一下。

编辑:似乎研究最多的树编辑距离算法仅考虑创建/删除节点和重新标记节点。这不能直接适用于这个问题,因为这个问题允许移动整个子树,这使得它变得更加困难。 “更简单”编辑距离问题的当前最快运行时间是O(N^3)。我想这个运行时间会慢得多。

有用的链接/参考资料

An Optimal Decomposition Algorithm for Tree Edit Distance - Demaine,Mozes,Weimann

答案 3 :(得分:1)

  1. 枚举B中的所有文件及其关联的大小和校验和; 按大小/校验和排序。

  2. 枚举A中的所有文件及其关联的大小和校验和; 按大小/校验和排序。

  3. 现在,进行有序列表比较,请执行以下操作:

    一个。对于A中的每个文件而不是B,删除它。

    湾对于B中的每个文件而不是A,创建它。

    ℃。对于A和B中的每个文件,重命名从A到B遇到的数量,然后在B中复制其余文件。如果要覆盖现有文件,请将其保存在单独列表中。如果在该列表中找到A,请将其用作源文件。

  4. 对目录执行相同操作,删除A中的但不在B中,并在B中添加但在A中不添加。

    您可以按校验和/大小进行迭代,以确保您永远不必访问文件两次,或者担心删除稍后需要重新同步的文件。我假设你试图保持两个目录同步而不进行不必要的复制?

    总体复杂度为O(N log N)加上读取所有这些文件及其元数据所需的时间。

    这不是树编辑距离问题;它更像是生成树的列表同步问题。

答案 4 :(得分:0)

只有非常重要的问题是移动文件夹和文件。重命名,删除和创建是微不足道的,可以在第一步完成(或者在完成时更好)。

然后,您可以将此问题转换为问题白名转换树,这些问题包括相同的叶子但不同的拓扑结构。

  1. 您决定从某个文件夹/存储区移动哪些文件以及哪些文件将保留在文件夹中。决定基于源和目标中相同文件的数量。

  2. 您应用相同的策略在新拓扑中移动文件夹。

  3. 如果您忘记文件夹的名称并考虑文件和拓扑,我认为您应该接近最佳或最佳。