2 つのファイルを比較するために使用する適切なアルゴリズムを探しています。diff
いくつかの制約が追加されたため、より良いことができると思います。
私が持っているのは、それぞれファイルのリストを含む 2 つのテキスト ファイルです。これらは、2 つの異なる時点で取得された、システム上のすべてのファイルのスナップショットです。2 つのスナップショット間で追加または削除されたファイルを特定したいと考えています。
これらのファイルを比較するために使用できますdiff
が、次の理由により使用しません。
diff
ファイル内のどのチャンクが変更されたかを見つけて、変更をグループ化しようとします。変更された行のリストを探しているだけで、最長共通部分列などを見つけるよりもはるかに簡単な問題になるはずです。一般化された差分アルゴリズムは、実行時または空間でO(mn)です。時間でO(m+n) 、空間でO(1)のようなものを探しています。
問題の制約は次のとおりです。
ファイルのリストは、両方のファイルで同じ順序になっています。必ずしもアルファベット順ではありませんが、相対的な順序は同じです。
ほとんどの場合、リスト間に違いはありません。違いがある場合、通常、新規/削除されたファイルはほんの一握りです。
「このディレクトリ全体が削除されました」や「100 ~ 200 行が新しい」など、結果をグループ化する必要はありません。異なる各行を個別にリストできます。
これは、並べ替えられた 2 つのリストがあり、2 つのリストの違いを見つけようとする問題と同じだと思います。問題は、リスト項目が必ずしもアルファベット順にソートされているとは限らないため、ある項目が別の項目より「大きい」かどうかわからないことです。両方のリストに存在するファイルが同じ順序になることがわかっているだけです。
参考までに、数年前にこの質問をAsk Metafilterに投稿しました。事前にいくつかの潜在的な回答に回答させてください.
回答:この問題はLongest Common Subsequenceと呼ばれます。
応答:単純なアルゴリズムはO(mn)時間/空間で実行され、より優れたアルゴリズムは複雑で「ヒューリスティック」であるため、最長の一般的なサブシーケンスを回避しようとしています。私の直感では、追加された制約により線形時間アルゴリズムが存在することがわかります。
答え:アルファベット順に並べ替えてから比較してください。
応答:それはO(m log m+n log n)になり、 O(m+n)よりも悪くなります。