У меня есть некоторые проблемы. Я должен добавить много разных значений и просто получить только k-й по величине в конце. Как я могу эффективно реализовать это и какой алгоритм использовать?Получить k-ые самые большие значения
ответ
Алгоритм:
Создать бинарную максимальную кучу, и добавить каждый из первых
K
значений в кучу.Для каждого из оставшихся
N-K
значений, если она больше, чем последнее значение в куче:Поставил вместо последнего значения, и пузырек его для того, чтобы прибегать к куче.
Извлеките все значения (
K
) из кучи в список.
Сложность:
O(K)
O((N-K)×log(K))
O(K×log(K))
Если N-K ≥ K
, то общая сложность O((N-K)×log(K))
.
Если N-K < K
, то общая сложность O(K×log(K))
.
Ваш ответ так хорош, как может быть, но. Imvho вы должны попробовать немного «заполнить пробелы» для OP, возможно, короткий пример использования модуля 'heapq' в stdlib ... – gboffi
@gboffi: Какая стандартная библиотека? ОП не указывал язык или среду. Этот ответ так же хорош, как может быть предоставлена информация, предоставленная ОП. –
К сожалению, вы правы ... для записи: Я думал о 'python'. – gboffi
(на основе комментариев, которые вы не хотите, чтобы хранить все номера, вы видели ...)
Держите список беговой (отсортированный) из к величине вы видели до сих пор. Когда вы получите новые номера, посмотрите, больше ли он, чем наименьший элемент в списке. Если это так, удалите наименьший элемент и вставьте (отсортированный) новый элемент в список k наибольший. Ваш первоначальный список k (когда вы не видели числа) будет состоять из k записей отрицательной бесконечности.
Вместо сохранения отсортированного списка OP должен поддерживать кучу ... или, может быть, отсортированный список достаточно хорош? Я думаю, что это зависит от 'k' – gboffi
Вы правы, вам нужно только одно, чтобы вы могли эффективно извлекать (или читать) мин и эффективно добавлять новый элемент. Сортировка заключалась в том, чтобы сделать это «интуитивно простым». – TravisJ
Вы тоже правы: куча более эффективна и сложна, отсортированный список более обременителен и прост и, вероятно, подходит для OP. – gboffi
Сначала постройте max-heap, используя те элементы, которые являются O (n) временем. затем извлеките k-1 элементов в O (klogn).
Не оптимально: что, если n ужасно велико (т. Е. Не вписывается в память), а k очень мало? Вместо этого: постройте кучу до k элементов и отбросьте минимум каждый раз, когда вы вставляете k + 1-й элемент. – BeyelerStudios
- 1. словари, содержащие самые большие значения
- 2. Как получить и отобразить самые большие значения из базы данных?
- 3. Как найти самые большие каталоги
- 4. Второе и третье Самые большие значения T-SQL
- 5. Суммировать самые большие 2 значения в значении 4?
- 6. Как отобразить самые большие и наименьшие значения массива
- 7. Получить самые близкие верхние значения
- 8. Найти уникальные и самые большие значения строки из массива
- 9. Самый эффективный способ найти самые большие и наименьшие значения? (C++)
- 10. Найти самые большие три числа в строке
- 11. Самые большие/самые длинные записи в таблице varchar
- 12. Получите самые большие скидки, используя sql-запрос
- 13. Самые большие 10 файлов в каталоге
- 14. Найти самые большие 3 числа в векторе
- 15. получил самые большие данные на основе поля
- 16. Найти самые большие наборы последовательных периодов времени
- 17. Как узнать самые большие утечки памяти?
- 18. Каковы самые большие проблемы с ASP.Net MVC
- 19. найти самые большие проблемы с контуром gcd
- 20. Самые большие пятна в матрице C#
- 21. log4net, протоколирование, каковы самые большие преимущества
- 22. Python - Найти самые большие числа в массиве
- 23. Самые большие отчеты с PHP и MySQL
- 24. Найти самые большие размеры изображения из списка
- 25. Как распечатать самые большие цифры на карте
- 26. Получить самые низкие значения больше нуля
- 27. Получить последние и самые значения в MySQL
- 28. Как получить самые повторяющиеся значения с Eloquent?
- 29. Самые низкие значения массива
- 30. PostgreSQL выбирая самые высокие значения
Что вы подразумеваете под "must add"? – nop77svk
Если подход: «поместите их в список, отсортируйте список, возьмите верхние элементы k», не решит вашу проблему, которую вам придется немного разработать. Пожалуйста, прочитайте http://stackoverflow.com/help/how-to-ask – reto
Я не хочу хранить все свои значения и в конце концов должен получить только k. –