给定两个文件树 A 和 B,是否可以确定将 A 转换为 B 所需的最短操作序列或操作序列?
一个操作可以是:
- 创建一个新的空文件夹
- 创建一个包含任何内容的新文件
- 删除文件
- 删除一个空文件夹
- 重命名文件
- 重命名文件夹
- 在另一个现有文件夹中移动文件
- 在另一个现有文件夹中移动文件夹
当 A 和 B 在相同文件夹结构中具有相同内容(或相同大小相同 CRC)和相同名称的相同文件时,它们是相同的。
这个问题让我困惑了一段时间。目前我有以下基本想法:
- 计算一个数据库:
- 存储文件名及其 CRC
- 然后,找到所有没有子文件夹的文件夹,并根据它们包含的文件的 CRC 计算 CRC,并根据它们包含的文件的总大小计算大小
- 提升树为每个父文件夹创建一个 CRC
- 使用具有数据库 A 和数据库 B 的以下循环:
- 计算 A ∩ B 并从两个数据库中删除此交集。
- 使用内连接在 A 和 B 中查找匹配的 CRC,首先是文件夹,按大小排序
- 当有结果时,使用第一个结果移动文件夹或文件(如有必要,可能创建新文件夹),从两个数据库中删除结果的源行。如果有移动,则更新 db A 中新位置父文件夹的 CRC。
- 然后删除数据库 A 中引用的所有文件和文件夹,并创建数据库 B 中引用的文件和文件夹。
但是,我认为这确实是一种次优的方法。你能给我什么建议?
谢谢!