Heim >Backend-Entwicklung >C++ >Wie kann ich zwei Listen effizient auf Gleichheit vergleichen, dabei die Reihenfolge ignorieren und Duplikate zulassen?

Wie kann ich zwei Listen effizient auf Gleichheit vergleichen, dabei die Reihenfolge ignorieren und Duplikate zulassen?

DDD
DDDOriginal
2025-01-21 07:37:10246Durchsuche

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

VergleichslisteObjekte auf Gleichheit

In diesem Artikel wird erläutert, wie zwei List-Objekte verglichen werden, um festzustellen, ob sie dieselben Elemente enthalten, unabhängig von der Reihenfolge der Elemente. Es ist zu beachten, dass Objekte vom Typ MyType in jeder Liste mehrmals vorkommen können.

Erstplan

Um eine exakte Gleichheit zu gewährleisten, d. h. beide Listen enthalten die gleichen Elemente und deren Häufigkeiten, empfiehlt es sich, die Listen vor dem Vergleich zu sortieren:

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

Optimierungsplan

Um die Leistung zu verbessern, hat jedoch jemand eine andere Lösung vorgeschlagen:

<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>

Die Leistung dieser Methode ist deutlich besser als die der ursprünglichen Lösung. Sie erfordert nur die IEquatable-Schnittstelle und nicht die IComparable-Schnittstelle.

Umgang mit verschiedenen Datentypen

Um sich an die Situation anzupassen, dass unterschiedliche Datentypen (einschließlich nullbarer Typen) als Schlüssel enthalten sind, kann eine verbesserte Lösung verwendet werden:

<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>

Das obige ist der detaillierte Inhalt vonWie kann ich zwei Listen effizient auf Gleichheit vergleichen, dabei die Reihenfolge ignorieren und Duplikate zulassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn