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
Freigeben: 2025-01-21 07:37:10
Original
181 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage