Любая сортировка на основе сравнения повлечет за собой O(N log N)
или худшую временную сложность, поэтому (асимптотически) это не очень хорошие советы.
Ваш подход имеет O(N)
временную сложность, и это лучшее, что вы можете получить,Вы можете попытаться понизить константу (в настоящее время вы делаете примерно 6*N
доступ к элементам списка).
Я бы сделал это в две итерации, например: сначала посчитайте частоты, используя HashMap.Затем, переберите записи на карте и сохраните упорядоченный 5-элементный массив из 5 наиболее часто встречающихся значений, которые вы когда-либо видели.С каждым новым элементом проверьте, является ли значение более распространенным, чем 5-е наиболее распространенное на данный момент, и при необходимости обновите «Топ 5».
ОБНОВЛЕНИЕ Более простое решение, той же сложности сложности .Сначала рассчитайте частоты, используя HashMap
.Затем поместите все записи в PriorityQueue
и вставьте пять значений.Записи должны быть парами значение-частота, сопоставимыми по частоте (как в решении @ Jigar).Такой порядок не будет «согласован с равными» (см. Comparable для объяснения), но это нормально.