ホームページ >バックエンド開発 >C++ >順序を無視し、重複を許可しながら、2 つのリストが等しいかどうかを効率的に比較するにはどうすればよいですか?

順序を無視し、重複を許可しながら、2 つのリストが等しいかどうかを効率的に比較するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-21 07:37:10185ブラウズ

How Can I Efficiently Compare Two Lists for Equality, Ignoring Order and Allowing Duplicates?

リスト オブジェクトが等しいかどうかを比較

この記事では、要素の順序に関係なく、2 つの List オブジェクトを比較して、それらに同じ要素が含まれているかどうかを確認する方法について説明します。 MyType タイプのオブジェクトは、どのリストでも複数回出現する可能性があることに注意してください。

当初計画

正確な同一性を確保するには、つまり両方のリストに同じ要素とその頻度が含まれるようにするため、比較する前にリストを並べ替えることをお勧めします。

<code class="language-C#">Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))</code>

最適化計画

しかし、パフォーマンスを向上させるために、誰かが別の解決策を提案しました:

<code class="language-C#">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2) {
  var cnt = new Dictionary<T, int>();
  foreach (T s in list1) {
    if (cnt.ContainsKey(s)) {
      cnt[s]++;
    } else {
      cnt.Add(s, 1);
    }
  }
  foreach (T s in list2) {
    if (cnt.ContainsKey(s)) {
      cnt[s]--;
    } else {
      return false;
    }
  }
  return cnt.Values.All(c => c == 0);
}</code>

このメソッドのパフォーマンスは、最初のソリューションよりも大幅に向上しています。必要なのは IEquatable インターフェイスだけであり、IComparable インターフェイスは必要ありません。

さまざまなデータ型の処理

キーとして異なるデータ型 (null 許容型を含む) が含まれる状況に適応するために、改善されたソリューションを使用できます。

<code class="language-C#">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer) {
  var cnt = new Dictionary<T, int>(comparer);
  ...
}</code>

以上が順序を無視し、重複を許可しながら、2 つのリストが等しいかどうかを効率的に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。