Получить значение режима в Java - PullRequest
4 голосов
/ 04 апреля 2009

Кто-нибудь знает, как я могу получить значение режима из массива? Например, если у меня есть массив с разностным номером, как я могу использовать Java для поиска, какое число больше всего отображается?

Ответы [ 3 ]

10 голосов
/ 04 апреля 2009

Завершает за O (n), а не за O (n ^ 2). Требуются массивы длиной> 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;
}
3 голосов
/ 04 апреля 2009

Это немного, и я не знаю о его производительности, но если вы захотите попробовать Groovy с вашей Java ...

static int modal( ArrayList values ) {
    use(Collections){
        values.max{ values.frequency(it) } 
    }
}
0 голосов
/ 04 апреля 2009

Базовый, хотя и неэффективный алгоритм будет выглядеть примерно так:

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

Вы могли бы сделать немного лучше, предварительно рассчитав частоты для каждого значения и сохранив их, возможно, на карте или в аналогичном формате, хотя для этого все равно потребуется циклическое изменение значений, а для определения того, какая из них имеет самую высокую частоту, потребуется еще один цикл. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...