вычисление частоты числа в массиве - PullRequest
0 голосов
/ 30 апреля 2010

У меня есть массив, scores[5][5], и он заполнен результатами тестов.

Мне нужно найти наиболее часто встречающийся счет и вернуть его.

Ответы [ 5 ]

2 голосов
/ 30 апреля 2010

Я бы просто создал HashMap<Integer,Integer>, где первое целое число - это значение в массиве оценок, а второе - частота.

Затем обработайте заполнение массива в hashmap. Если ключ уже существует, увеличьте счет на единицу. Если это новый ключ, установите его на один.

Затем обработайте хэш-карту, чтобы найти значение с наибольшим вхождением.


Я собирался поработать над исходным кодом, как только получил доступ к машине, на которой была установлена ​​Java, но, поскольку она теперь помечена как домашняя работа, это только алгоритмы (которые в любом случае будут лучше для вас):

Create empty hashmap freq
For each entry in your array (probably nested loops):
    If entry.value is not in freq:
        Add entry.value to freq, set its count to zero
    Increase count of freq.value
Set max_count to 0
For each item in freq:
    If item.count is greater than max_count:
        Set max_list to an empty list
        Set max_count to item.count
    If item.count is equal to max_count:
        Append item.value to max_list
If max_count is greater than 0:
    Output max_count, max_list

Я бы следовал базовому алгоритму, который состоит из двух последовательных циклов.

Первый просто создает отображение значений на счетчики, чтобы вы могли найти наибольшее количество позже.

Второй проходит по карте и создает список значений с наибольшим количеством.

1 голос
/ 30 апреля 2010

Ну, есть две части: повторение и сохранение частоты каждого из них. Оба они предполагают использование массива / массива. Мы можем направить вопросы, если вам нужна дополнительная помощь. : D

0 голосов
/ 30 апреля 2010

Для подобных вещей напишите код, который моделирует, как вы будете делать вещи в реальной жизни.

Давайте модель:

Ваш массив [5] [5]: это просто сетка чисел с 5 столбцами и 5 строками.

Начните с позиции 0,0 - прочитайте значение в этой позиции и запустите список (в Java, ArrayList или HashMap), добавьте число в список и присвойте ему хэш-метку (значение 1) чтобы показать, что вы видели это один раз.

Перейдите через ряд, затем назад влево и вниз по ряду и др.

Каждый номер, который вы прочитали, проверьте, есть ли он уже в вашем списке. Если это так, просто сделайте еще одну метку (добавьте 1). Если нет, то добавьте номер в свой список и поставьте ему хэш-знак.

После того, как вы закончите чтение массива, посмотрите на свой список с самого начала и отслеживайте число с наибольшим количеством хеш-меток, которое вы видели, положив на него палец (сохраняя число в переменной).

Вернуть эту последнюю переменную.

0 голосов
/ 30 апреля 2010

Или сохраняйте указатель на текущий самый большой из них на ходу. Каждый раз, когда вы создаете или обновляете, сравните, чтобы увидеть, превысил ли вы предыдущее значение, и замените его, если он у вас есть. Сохраняет еще один проход через хэш-карту.

0 голосов
/ 30 апреля 2010

Поскольку оценки могут находиться в ограниченном диапазоне (например, 0..100), вы можете использовать счетный массив, чтобы сделать это быстро. По сути, вы делаете первый этап подсчета сортировки .

count для всех возможных оценок начинается с 0, затем для каждого счета s, приращение count[s]. Как только все оценки обработаны, отсканируйте count и посмотрите, какой count[k] является самым высоким.

Вы также можете отслеживать наиболее частые результаты во время подсчета. Просто сделайте что-то вроде этого:

// init
mostFrequent = 0;

// during increment
count[s]++;
if (count[s] > count[mostFrequent]) {
  mostFrequent = s;
}

Поскольку ваши оценки расположены в 2-мерной матрице (по какой-то причине?), Вы можете обрабатывать каждую оценку следующим образом:

int[] count = new int[RANGE]; // valid scores are 0..RANGE-1

mostFrequent = 0;
for (int[] tuplet : scores) {
   for (int s : tuplet) {
     count[s]++;
     if (count[s] > count[mostFrequent]) {
        mostFrequent = s;
     }
   }
}

report(mostFrequent, count[mostFrequent]);
...