2009-04-04 3 views
4

배열에서 모드 값을 얻으려면 어떻게해야합니까? 예를 들어 차이 개수가있는 배열이있는 경우 Java를 사용하여 가장 많이 나타나는 숫자를 검색하려면 어떻게해야합니까?Java에서 모드 값 가져 오기

답변

10

O (n^2)와는 대조적으로 O (n)에서 완료됩니다. > 0

public static int getMode(int[] values) { 
    HashMap<Integer,Integer> freqs = new HashMap<Integer,Integer>(); 

    for (int val : values) { 
    Integer freq = freqs.get(val); 
    freqs.put(val, (freq == null ? 1 : freq+1)); 
    } 

    int mode = 0; 
    int maxFreq = 0; 

    for (Map.Entry<Integer,Integer> entry : freqs.entrySet()) { 
    int freq = entry.getValue(); 
    if (freq > maxFreq) { 
     maxFreq = freq; 
     mode = entry.getKey(); 
    } 
    } 

    return mode; 
} 
+2

정수 값 대신 AtomicInteger를 사용하면 개수가 128보다 많으면 개체 할당 수가 줄어 듭니다. –

+0

이 방법을 사용하면 모드를 결정하는 것이 좋습니다. 솔루션은 실제로는 freqs.put (val, (freq == null? 1 : freq + 1)); 감사합니다 ... –

0

비효율적 인 알고리즘이기는하지만, 기본은 무언가 같이 될 것이다 : 당신은에 의해 조금 더 잘 할 수

static int modal(int[] values) { 
    int modal = 0; 
    int mfreq = 0; 
    for(int i : values) { 
     // Is this value the most frequent we've found so far? 
     int freq = 0; 
     for(int j : values) { 
      if(j == i) { 
       freq++; 
      } 
     } 
     if(freq > mfreq) { 
      modal = i; 
      mfreq = freq; 
    } 
    return modal; 
} 

미리 계산 각 값에 대해 주파수를 아마도지도 또는 유사한에서 그들을 저장,이 것이지만 여전히 값을 통해 루핑 할 필요가 있으며 가장 높은 빈도를 가진 루프를 결정하는 또 다른 루프가 필요합니다.

3

이 밖에 조금, 그리고 성능의에 대해 잘 모르겠지만, 당신이 당신의 자바 조금 그루비를 시도 할 의사가 있다면 ... 길이의 배열을 필요

static int modal(ArrayList values) { 
    use(Collections){ 
     values.max{ values.frequency(it) } 
    } 
} 
+0

그루비 메서드/클래스를 Java 내에서 사용할 수 있습니까? (즉, Groovy 런타임 라이브러리가 필요하거나 다른 마법이 필요합니까?) –

+1

Groovy.jar 만 있으면됩니다. 당신의 ide가 그루비를 지원한다면 (Spring Tool Suite 및/또는 Groovy eclipse 플러그인을 확인하십시오) 도움이됩니다. 다음은 netbeans를 사용한 예입니다. http://netbeans.org/kb/docs/java/groovy-quickstart.html#groovy –