Кратчайшая последовательность операций преобразования одного файлового дерева в другое

Учитывая два дерева файлов A и B, можно ли определить кратчайшая последовательность операций или короткая последовательность операций , которая необходима для преобразования A в B?

Операция может быть следующей:

  1. Создать новую пустую папку
  2. Создать новый файл с любым содержимым
  3. Удалить файл
  4. Удалить пустую папку
  5. Переименовать файл
  6. Переименовать папку
  7. Переместить файл в другую существующую папку
  8. Переместить папку в другую существующую папку

A и B идентичны, если они будут иметь одинаковые файлы с одинаковым содержимым (или одинаковым размером с одинаковой CRC) и одинаковым именем в та же структура папок.

Этот вопрос уже некоторое время озадачивает меня. На данный момент у меня есть следующая основная идея:

  • Вычислить базу данных:
    • Сохраните имена файлов и их CRC
    • Затем найдите все папки без подпапок и вычислите CRC из CRC файлов, которые они содержат, и размер из общего размера файлов, которые они содержат
    • Ascend дерево для создания CRC для каждой родительской папки
  • Используйте следующий цикл с базой данных A и базой данных B:
    • Вычислить A ∩ B и удалить это пересечение из обеих баз данных.
    • Используйте внутреннее соединение, чтобы найти совпадающие CRC в A и B, сначала папки, в порядке убывания размера
    • , пока есть результат, используйте первое result, чтобы переместить папку или файл (возможно, создав новые папки, если необходимо), удалите из обеих баз данных исходные строки результата. Если было перемещение, обновите CRC родительских папок нового местоположения в базе данных A.
    • Затем удалите все файлы и папки, на которые есть ссылки в базе данных A, и создайте те, на которые есть ссылки в базе данных B.

Однако я думаю, что это действительно неоптимально способ сделать это. Что вы можете мне посоветовать?

Спасибо!

16
задан Benoit 10 August 2011 в 17:34
поделиться