0

あなたが私を助けてくれることを願っています。

次のような行を含む 135.000 行の長さの txt ファイルがあります111706469;1972WE;26;Wel

プログラムが行うべきことは、すべての行をその前にあるすべての行と比較して、80% 以上類似しているかどうかを調べ、元の行の行番号を示すことです。

このように私が自分でなんとかしたこと。

            if (rows.Length > 1) {
                for (int rowIndex = 1; rowIndex < rows.Length; rowIndex++) 
                {
                    string cols = rows[rowIndex];
                    bool Dubbel = false;

                    for (int DupIndex = 0; DupIndex < rowIndex; DupIndex++)
                    {
                        string SearchDup = rows[DupIndex];
                        decimal ComparisonResult = Compare(cols, SearchDup);

                        if (ComparisonResult > 80)
                        {
                            cols += ";" + DupIndex;
                            Dubbel = true;
                            break;
                        }  
                    }

                    Console.WriteLine(rowIndex + ";" + cols); 
                }
            }

これは、プログラムが配列項目ごとに何度も配列を通過する必要があることを意味します。私の質問は、これを行うためのより速い/より良い方法はありますか?

あなたが私に与えることができるどんな助けでも大歓迎です。

4

3 に答える 3

0

問題は、浮動小数点数を返すファジーマッチングにあります-ファジー関数自体の詳細なしに、これを O(N*N) よりも最適化する方法はありません(私が間違っている場合-誰かが私を修正してください)

完全に一致する場合は、最初にそれらを削除できます。この方法では、N^2 の複雑さが (NK)^2 に軽減されます。完全に一致するものが少なくともいくつかある場合、この操作は価値があります。

HashSet<>のような 2 番目のオブジェクトを必要としない を使用します。Dictionary

List<string> rows = new List<string>(new[] {"AAA","BBB","AAA","CCC"});

HashSet<string> foundLines = new HashSet<string>();

foreach (string row in rows){
if (!foundLines.Contains(row))
    foundLines.Add(row);
}
rows = foundLines.ToList();

次に、アルゴリズムを続行します

于 2013-04-10T21:47:04.833 に答える
0

大幅なオーバーホールなしでは、多くの最適化を行うことはできません。完全に一致したり、ターゲットに厳密に一致するものを検索したりするのは簡単ですが、オブジェクト間の違いについては、各アイテムを前の各アイテムと比較する必要があります。

基本的に、一連のN文字列が与えられた場合、、 、 などと比較Nする必要があります。次に、 と の間に関係がないため、 に加えて、とそれらすべてを再度比較する必要があります。N-1N-2N-3N+1NN+1N

于 2013-04-10T21:54:19.313 に答える