Во-первых, было бы разумно никогда больше не говорить: «Я не считаю это очень оптимизированным подходом». Вы не будете знать, какая часть вашего кода замедляет вас, пока вы не ставите на него профайлер.
Во-вторых, самый простой способ сделать то, что вы пытаетесь сделать, - и то, что будет более понятно кому-то позже, если они попытаются выяснить, что делает ваш код, - использовать Collections.sort()
и выбрать последний три элемента. Тогда любой, кто увидит код, будет знать: «О, этот код принимает три самых больших элемента». В четком коде есть такая ценность, что он, вероятно, переведет любую оптимизацию, которую вы могли бы сделать. Это также не позволит вам писать ошибки, например, придавать естественный смысл тому, что происходит, когда кто-то дважды вводит один и тот же номер в список или дает полезное сообщение об ошибке, когда в списке всего два элемента.
В-третьих, если вы действительно получаете данные, которые настолько велики, что операции O (n log n) выполняются слишком медленно, вы должны переписать структуру данных, которая содержит данные в первую очередь - java.util.NavigableSet
, например, предлагает метод .descendingIterator()
которые вы можете исследовать для своих первых трех элементов, это будут три максимальных числа. Если вы действительно хотите, можно использовать структуру данных кучи, и вы можете снять верхние 3 элемента с помощью чего-то вроде одного сравнения за счет добавления процедуры O (log n).
При обновлении значения заменяются и удаляются или добавляются только? –
Возможны оба варианта –
Вы должны понимать, что «дорогостоящий» - относительный термин. Как программист вы всегда торгуете различными расходами. Стоимость сортировки - O (n log n). Это означает, что даже для очень больших коллекций стоимость сортировки списка не растет намного быстрее, чем просто перебирается через список.Некоторое быстрое тестирование показывает, что самый большой массив, который я могу сделать на моем ноутбуке, имеет размер примерно 2^27 и самый большой, который я могу сортировать за пять секунд с помощью 'Arrays.sort (int [] nums)' равно 2^24 (16,7 млн записей). Если вы выбираете 3 лучших из пула менее миллиона, просто сортируйте его. –