> 백엔드 개발 > C++ > 순서를 무시하고 중복을 허용하여 두 목록의 동등성을 효율적으로 비교하려면 어떻게 해야 합니까?

순서를 무시하고 중복을 허용하여 두 목록의 동등성을 효율적으로 비교하려면 어떻게 해야 합니까?

DDD
풀어 주다: 2025-01-21 07:37:10
원래의
181명이 탐색했습니다.

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

목록 비교 객체 동일성

이 문서에서는 두 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>
로그인 후 복사

위 내용은 순서를 무시하고 중복을 허용하여 두 목록의 동등성을 효율적으로 비교하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿