2010-04-30 4 views
0

У меня есть массив, scores[5][5] и он заполнен тестовыми баллами.Расчет частоты числа в массиве

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

+0

Вы этот далтон? http://stackoverflow.com/users/307394/dalton – trashgod

+0

Возникает ли этот вопрос? http://stackoverflow.com/questions/2740852/finding-the-best-person-in-an-array – trashgod

+0

Да, почему это так почему-то – dalton

ответ

1

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

+0

Что такое итерационные баллы и как использовать массив/arraylist – dalton

+2

Проверьте [это] (http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html) и [это] (http : //java.sun.com/docs/books/tutorial/collections/index.html). – BalusC

2

Я бы просто создал 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

Поскольку баллы, вероятно, находятся в ограниченном диапазоне (например, 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]); 
+0

Так как это больше кода, чем у алго, я должен сказать, что у Далтона нет причин не получать приличный сорт. Позор тоже, так как речь идет о самой простой проблеме для решения в iter's. – jcolebrand

0

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

0

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

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

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

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

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

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

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

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