2 つのファイル ツリー A と B が与えられた場合、 A を B に変換するために必要な操作の最短シーケンスまたは短い操作シーケンスを決定することは可能ですか?
操作は次のとおりです。
- 新しい空のフォルダーを作成する
- 任意の内容で新しいファイルを作成します
- ファイルを削除する
- 空のフォルダを削除する
- ファイルの名前を変更する
- フォルダの名前を変更する
- ファイルを別の既存のフォルダー内に移動する
- 別の既存のフォルダー内にフォルダーを移動する
A と B は、同じフォルダー構造内に同じ内容 (または同じサイズ、同じ CRC) で同じ名前の同じファイルを持つ場合、同一です。
この質問は、しばらくの間私を困惑させてきました。現時点では、次の基本的な考え方があります。
- データベースを計算します。
- ファイル名とその CRC を保存する
- 次に、サブフォルダーのないすべてのフォルダーを検索し、それらに含まれるファイルの CRC から CRC を計算し、それらに含まれるファイルの合計サイズからサイズを計算します。
- ツリーを上って、各親フォルダーの CRC を作成します
- データベース A とデータベース B を持つ次のループを使用します。
- A ∩ B を計算し、両方のデータベースからこの共通部分を削除します。
- 内部結合を使用して、A と B で一致する CRC を見つけます。最初にフォルダーをサイズ降順で並べます
- 結果がある間、最初の結果を使用してフォルダーまたはファイルを移動し (必要に応じて新しいフォルダーを作成する可能性があります)、結果のソース行を両方のデータベースから削除します。移動があった場合は、データベース A の新しい場所の親フォルダーの CRC を更新します。
- 次に、データベース A で参照されているすべてのファイルとフォルダーを削除し、データベース B で参照されているファイルとフォルダーを作成します。
ただし、これは実際には最適ではない方法だと思います。何をアドバイスしてもらえますか?
ありがとうございました!