У меня есть массив, scores[5][5]
и он заполнен тестовыми баллами.Расчет частоты числа в массиве
Мне нужно найти наиболее часто встречающийся счет и вернуть его.
У меня есть массив, scores[5][5]
и он заполнен тестовыми баллами.Расчет частоты числа в массиве
Мне нужно найти наиболее часто встречающийся счет и вернуть его.
Ну, есть 2 части: повторение баллов и сохранение частоты каждого балла. Оба они связаны с использованием массива/arraylist. Мы можем задать вопросы, если вам нужна дополнительная помощь. : D
Я бы просто создал HashMap<Integer,Integer>
, где первое целое число является значением в массиве баллов, а второе - частотой.
Затем обработайте массив, заполняя хэш-карту. Если ключ уже существовал, пересчитайте счет на единицу. Если это новый ключ, установите его в один.
Затем обработайте хэшмап, чтобы найти значение с наибольшим вхождением.
Я собирался работать на исходном коде, как только я получил доступ к машине, на которой была установлена 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
Это основной алгоритм, который я бы выполнил, который состоит из двух последовательных циклов.
Первый просто создает отображение значений для подсчета, чтобы вы могли найти наибольшее количество позже.
Вторая проходит через карту и создает список значений с наивысшим счетчиком.
Поскольку баллы, вероятно, находятся в ограниченном диапазоне (например, 0..100
), вы можете использовать подсчетный массив, чтобы сделать это быстро. В основном, вы делаете первую фазу counting sort.
count
для всех возможных результатов начинается с 0
, затем за каждый счет s
с приращением count[s]
. Как только все оценки будут обработаны, сканируйте count
и посмотрите, какая из count[k]
является самой высокой.
Вы также можете отслеживать самый частый счет, когда вы делаете подсчет. Просто сделать что-то вроде этого: (? По какой-то причине)
// init
mostFrequent = 0;
// during increment
count[s]++;
if (count[s] > count[mostFrequent]) {
mostFrequent = s;
}
Поскольку ваши баллы расположены в 2d матрице, вы можете обработать каждый счет следующим образом:
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]);
Так как это больше кода, чем у алго, я должен сказать, что у Далтона нет причин не получать приличный сорт. Позор тоже, так как речь идет о самой простой проблеме для решения в iter's. – jcolebrand
Или хранить указатель на самый большой из них, когда вы идете. Каждый раз, когда вы создаете или обновляете, сравните, чтобы увидеть, только что вы превысили предыдущий и замените его, если у вас есть. Сохраняет другой проход через хэш.
Для таких вещей напишите код, который моделирует, как вы будете делать вещи в реальной жизни.
Давайте модель:
Ваш [5] [5] массив: Это просто сетка чисел с 5 столбцов и 5 строк.
Начало в позиции 0,0 - считывание значения в этой позиции и начало списка (в Java, ArrayList или HashMap), добавьте номер в список и присвойте ему метку хэша (значение 1) , чтобы указать, что вы видели его один раз.
Перейдите по строке, а затем назад влево и вниз по ряду, и др.
Каждый номер, который вы читаете, проверьте, уже ли он в вашем списке. Если это так, просто создайте еще одну метку хэша (добавьте 1). Если нет, добавьте номер в свой список и отметьте его отметкой.
После того, как вы закончите чтение массива, посмотрите на свой список с самого начала и отслеживайте число с наибольшими признаками хэша, которые вы видели, положив на него свой палец (сохраняя число в переменной).
Вернуть эту последнюю переменную.
Вы этот далтон? http://stackoverflow.com/users/307394/dalton – trashgod
Возникает ли этот вопрос? http://stackoverflow.com/questions/2740852/finding-the-best-person-in-an-array – trashgod
Да, почему это так почему-то – dalton