2

私のプログラムは重複を探しています。フォルダーとサブフォルダー内の他のすべてのファイルとファイルを比較します。問題は、チェックが重複していることです。

たとえば、次の(大雑把な)フォルダ構造を考えてみてください

-Folder1
---File1
---File2
---File3

-フォルダ2
---ファイル1
--- ファイル2

-Folder3
---File1
---File2
---File3
---File4

したがって、明確にするために、フォルダー 1、フォルダー 2、およびフォルダー 3 はすべてルート レベルにあり、それぞれのフォルダー内に存在するファイルがあることを意味します。

私のプログラムは、2 つの foreach ループを介して相互に比較しながら反復します。

 foreach (string path01 in  Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories))
 {
     foreach (string path02 in  Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories))
     {
           //perform logic with path01 and path02
     }
 }

ここでの問題は、反復の 1 つが Folder1\File1 を Folder2\File1 と比較することですが (これは望ましいことです)、Folder2\File1 と Folder1\File1 も比較します。そのチェックはすでに行われているため、これは非効率的です。上にリストしたファイル/フォルダーだけで誰が気にするかはわかりませんが、私のアプリケーションは何千ものフォルダーを比較していて、ファイルの数がわかりません。

私の頭の中では、アルファベット順に並べ替え、for ループを使用し、常に次の反復から開始して、検索が逆方向に進むのを防ぐ必要があると思いますが、よくわかりません。ある時点で、バブルソートが役立つかもしれないと思っていましたが、これはソートに関するものではありませんが、これを使用できるかどうかはわかりません。

この種の問題は文書化されており、存在していると確信しています。私が抱えている問題は、(私の投稿の長さからわかるように)パターンが存在するかどうかを調査できるように、Google 検索で説明する方法です。

それで、私の質問は、そのような問題のためのパターンまたはパラダイムがすでに存在するかということです.

4

2 に答える 2

2

重複をどのように検出していますか? 重複したファイル名を探しているだけですか、それともファイルを開いて内容も読んでいますか? いずれにせよ、 HashSetを使用する必要があります

var visitedFiles = new HashSet<String>();

foreach (string path01 in  Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories)) {
   String contents = // read in file contents
   String contentHash = md5(contents); // do a md5 hash of the contents

   if (!visitedFiles.contains(contentHash)) {
       visitedFiles.add(contentHash);
   } else {
      // duplicate file found
   }
}

これは、テストされていない基本的な例です。必要に応じて変更できます。ハッシュセットに文字列を格納する代わりに、より多くの情報を保持するクラス オブジェクトを格納できます (必要に応じてカスタマイズします)。

とにかく、このソリューションの時間の複雑さはO(n)、あなたのものとは対照的ですO(n^2)

于 2013-05-12T07:08:30.080 に答える