Если вы собираетесь делать это за постоянное число проходов по списку, вам понадобится вторая структура данных.
Если у вас есть нижняя и верхняя границы для значений в этом наборе и значения относительно плотные, то хорошим решением будет массив счетчиков.
В противном случае лучше использовать Map<Integer, Integer>
, где ключи — это элементы множества, а значения — счетчики.
Анализ
Если у вас нет нижних/верхних границ в наборе перед началом, то вы не знаете большой массив счетчиков для выделения. Итак, вам нужно сделать предварительный проход по массиву, чтобы найти границы... и теперь у вас есть решение с двумя проходами.
Если у вас есть нижняя и верхняя границы, но набор разрежен, то стоимость инициализации массива счетчиков + стоимость нахождения трех самых больших счетчиков будут доминировать над стоимостью подсчета элементов набора. Если разница достаточно велика (т. е. ввод большой и очень разреженный), HashMap будет быстрее и займет меньше памяти.
В качестве альтернативы
Если вам разрешено изменять массив, вы можете отсортировать его в порядке возрастания O(NlogN)
, а затем найти три наиболее часто встречающихся элемента за один проход по отсортированному массиву.
person
Stephen C
schedule
11.10.2010