Если вы собираетесь делать это в постоянном количестве проходов по списку, вам нужна вторая структура данных.
Если у вас есть нижняя и верхняя границы для значений в этом наборе, а значения относительно плотные, то массив счетчиков является хорошим решением.
В противном случае лучше использовать Map<Integer, Integer>
, где ключи являются элементами набора, а значениями являются счетчики.
Анализ
Если у вас нет нижнего/верхнего предела на множестве, прежде чем начать, то вы не знаете, большой массив счетчиков с целью распределения. Поэтому вам нужно сделать предварительный проход по массиву, чтобы найти границы ... и теперь у вас есть решение с двумя проходами.
Если у вас есть нижняя и верхняя границы, но набор разрежен, тогда стоимость инициализации массива счетчиков + стоимость поиска трех крупнейших счетчиков будет доминировать над стоимостью подсчета установленных элементов. Если разница достаточно велика (т. Е. Вход большой & очень разреженный), HashMap будет быстрее и займет меньше памяти.
Альтернативно
Если разрешено изменить массив, вы можете отсортировать его в порядке возрастания O(NlogN)
, а затем найти три наиболее распространенных элементов в одном проходе через отсортированный массив.
Фраза «если петля» делает мой мозг пострадал. – sje397
if (ifloop) {me.gougeOutEyes();} – ubiquibacon
Связанный - [Самый эффективный способ найти верхние K часто встречающихся слов в большой последовательности слов] (http: // stackoverflow.com/q/185697) (возможно, это не дубликат, потому что это касается слов, это касается чисел - некоторые подходы отличаются) – Dukeling