Учитывая два дерева файлов A и B, можно ли определить кратчайшую последовательность операций или короткую последовательность операций, которая необходима для преобразования A в В?
Операция может быть:
- Создать новую, пустую папку
- Создать новый файл с любым содержимым
- Удалить файл
- Удалить пустую папку
- Переименовать файл
- Переименовать папку
- Переместить файл в другую существующую папку
- Переместить папку в другую существующую папку
A и B идентичны, если они будут иметь те же файлы с тем же содержимым (или же с одним и тем же CRC) и с тем же именем в той же структуре папок.
Этот вопрос озадачил меня в течение некоторого времени. На данный момент у меня есть следующая основная идея:
- Вычислить базу данных:
- Сохранять имена файлов и их CRC
- Затем найдите все папки без подпапок и вычислите CRC из CRC файлов, которые они содержат, и размер из общего размера файлов, которые они содержат.
- Взять дерево, чтобы сделать CRC для каждой родительской папки
- Используйте следующий цикл, содержащий базу данных A и базу данных B:
- Вычислить A ∩ B и удалить это пересечение из обеих баз данных.
- Используйте внутреннее соединение, чтобы найти соответствующие CRC в и B, сначала папки, порядок по размеру desc
- пока есть результат, используйте первый результат для перемещения папки или файла (возможно, при необходимости создайте новые папки), удалите из обеих баз данных исходные строки результата. Если произошел переход, обновите CRC новых родительских папок местоположения в db A.
- Затем удалите все файлы и папки, указанные в базе данных A, и создайте ссылки, указанные в базе данных B.
Однако я думаю, что это действительно субоптимальный способ сделать это. Что вы могли бы дать мне в качестве совета?
Спасибо!