他の回答に加えて、各リストのすべての要素間で XOR で単純に構築された低コストのハッシュを作成することで、プロセスを高速化できます。リストを並べ替える必要はなく、取得するのはint
文字列よりも簡単かつ高速に格納できる だけです。
次に、結果の XOR された数値を Hashtable のキーとして使用し、挿入する前にキーの存在を確認するだけです。既存のキーが既に存在する場合にのみ、対応するリストを並べ替えて比較します。
単純な XOR を使用して衝突が発生する可能性があるため、一致が見つかった場合でもそれらを比較する必要があります。
結果は、配列を並べ替えて文字列に変換するよりもはるかに高速で、メモリフットプリントがはるかに少ないと思いました。
を独自に実装する場合はList<>
、その中に XOR キーの生成を作成して、リストの各操作で再計算されるようにすることができます。
これにより、重複リストをチェックするプロセスがさらに高速になります。
コード
以下は、これを実装するための最初の試みです。
Dictionary<int, List<List<int>>> checkHash = new Dictionary<int, List<List<int>>>();
public bool CheckDuplicate(List<int> theList) {
bool isIdentical = false;
int xorkey = 0;
foreach (int v in theList) xorkey ^= v;
List<List<int>> existingLists;
checkHash.TryGetValue(xorkey, out existingLists);
if (existingLists != null) {
// Already in the dictionary. Check each stored list
foreach (List<int> li in existingLists) {
isIdentical = (theList.Count == li.Count);
if (isIdentical) {
// Check all elements
foreach (int v in theList) {
if (!li.Contains(v)) {
isIdentical = false;
break;
}
}
}
if (isIdentical) break;
}
}
if (existingLists == null || !isIdentical) {
// never seen this before, add it
List<List<int>> newList = new List<List<int>>();
newList.Add(theList);
checkHash.Add(xorkey, newList);
}
return isIdentical;
}
一見したところ、最もエレガントでも読みやすくもありません。むしろ「ハッキー」であり、Guffa のよりエレガントなバージョンよりも優れたパフォーマンスを発揮するかどうかさえわかりません。
ただしList<int>
、ディクショナリにリストを格納することにより、XOR キーの衝突を処理します。
重複するキーが見つかった場合、不一致が見つかるまで、以前に保存された各リストをループします。
このコードの良い点は、おそらくほとんどの場合に得られる速度と同じくらい速く、衝突が発生したときに文字列をコンパイルするよりもさらに高速であることです。