> Java > java지도 시간 > Java 배열에서 중복된 정수를 효율적으로 감지하려면 어떻게 해야 합니까?

Java 배열에서 중복된 정수를 효율적으로 감지하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-07 09:39:15
원래의
192명이 탐색했습니다.

How Can I Efficiently Detect Duplicate Integers in a Java Array?

Java 배열에서 중복 항목 인식: 여정

Java 영역에서 자주 접하게 되는 통합 작업은 정수 배열(int []). 그러나 이러한 중복 항목을 식별하려고 시도할 때 일반적인 함정이 발생합니다. 문제와 해결책을 살펴보겠습니다.

다음 코드를 고려하세요.

int[] zipcodelist = // ...

duplicates = false;
for(j = 0; j < zipcodeList.length; j++){
    for(k = 0; k < zipcodeList.length; k++){
        if (zipcodeList[k] == zipcodeList[j]){
            duplicates = true;
        }
    }
}
로그인 후 복사

이 코드는 주어진 우편번호 목록에 중복된 요소가 포함되어 있는지 확인하는 것을 목표로 합니다. 그러나 중복이 존재하지 않는 시나리오는 설명하지 못합니다. 결과적으로 중복은 항상 true가 됩니다.

결함 식별

결함을 이해하기 위해 논리를 분석해 보겠습니다. 코드에는 목록의 각 요소를 다른 모든 요소와 비교하는 중첩 루프가 있습니다. 두 요소가 일치하면 중복이 true로 설정되어 중복이 있음을 나타냅니다. 그러나 중복 항목이 없으면 루프는 필연적으로 요소 자체를 비교합니다. 모든 요소에 대해 이 자체 비교는 중복 항목을 true로 설정합니다.

수정된 접근 방식

중복 항목을 올바르게 감지하려면 코드에서 자체 비교를 제외해야 합니다. 이를 달성하는 한 가지 방법은 다음과 같이 중첩 루프 구조를 수정하는 것입니다.

duplicates=false;
for (j=0;j<zipcodeList.length;j++)
  for (k=j+1;k<zipcodeList.length;k++)
    if (k!=j &amp;&amp; zipcodeList[k] == zipcodeList[j])
      duplicates=true;
로그인 후 복사

이 수정은 다음 인덱스(k=j 1)에서 내부 루프를 시작하여 자체 비교를 건너뜁니다.

대체 솔루션 탐색

수정된 접근 방식이 효과적으로 작동하는 동안 더 빠른 대안을 사용할 수 있습니다. 다음 해시맵 기반 솔루션을 고려해 보세요.

boolean duplicates(final int[] zipcodelist)
{
  Set<Integer> lump = new HashSet<Integer>();
  for (int i : zipcodelist)
  {
    if (lump.contains(i)) return true;
    lump.add(i);
  }
  return false;
}
로그인 후 복사

이 솔루션은 해시 세트를 활용하여 중복 요소를 효율적으로 확인합니다. 각 요소는 해시 세트에 추가되며 요소가 이미 존재하는 경우 중복을 의미합니다.

비트맵을 사용하는 또 다른 효율적인 접근 방식은 다음과 같습니다.

static boolean duplicates(final int[] zipcodelist)
{
   final int MAXZIP = 99999;
   boolean[] bitmap = new boolean[MAXZIP+1];
   java.util.Arrays.fill(bitmap, false);
   for (int item : zipcodelist)
     if (!(bitmap[item] ^= true)) return true;
   }
   return false;
}
로그인 후 복사

이 솔루션은 비트맵을 생성합니다. 배열의 가능한 최대값과 동일한 크기의 배열(MAXZIP) 그런 다음 비트 조작을 사용하여 입력 배열에서 발견된 각 요소에 해당 비트를 설정합니다. 비트가 이미 설정되어 있으면 중복되었음을 의미합니다.

벤치마킹 결과

이러한 접근 방식의 성능을 평가하기 위해 다양한 목록 크기로 벤치마크를 수행했습니다. 결과는 특히 대규모 목록의 경우 효율성 측면에서 비트맵 접근 방식이 확실한 승자로 나타났습니다.

Array Size Bitmap (ms) Hash Set (ms) Nested Loops (ms)
10 0.0 0.0 0.0
1,000 0.0 0.0 0.0
10,000 0.0 0.0 100.0
100,000 0.0 0.16 9,923.3

결론

Java 배열에서 중복 항목을 식별하는 것은 함정을 이해하고 나면 간단한 작업이 될 수 있습니다. 자체 비교를 피하거나 해시 세트 및 비트맵과 같은 대체 접근 방식을 활용함으로써 효율적이고 정확한 중복 감지를 달성하고 Java 애플리케이션의 성능을 최적화할 수 있습니다.

위 내용은 Java 배열에서 중복된 정수를 효율적으로 감지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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