Давайте предположим, что у нас есть очень большой файл, который содержит миллиарды целых чисел, и мы хотим, чтобы найти k
наибольшие элементы этих значений,Finding к величине элементы очень большой файл (в то время как к очень большой)
сложная часть, что k
сам по себе очень большой тоже, что означает, что мы не можем держать k
элементов в памяти (например, у нас есть файл с 100 биллона элементов, и мы хотим найти 10 миллиардов крупнейших элементов)
Как мы делаем это в O(n)
?
То, что я подумал:
Мы начинаем чтение файла и проверяем его с другим файлом, который удерживает k
наибольшие элементы (отсортированных в порядке возрастания), если элемент чтения больше, чем в первой строке второго файл мы удаляем первую строку, и мы вставляем ее во второй файл, временная сложность будет O(NlogK)
(если у нас есть случайный доступ к этому файлу, в противном случае это будет «O (Nk)»
Любая идея это в O(n)
, я думаю, если у нас есть внешняя версия Selection algorithm
(алгоритм секционирования в quicksort), мы могли бы сделать это в O(n)
но я не смог найти его где-нибудь
Каков диапазон чисел? – banarun
Они целые, это единственное, что мы знаем –
Вы хотите, чтобы каждое число k было уникальным в результате? Другими словами, пусть k равно 3, а файл 1,2,3,5,3,2,4,3,5 - результат 5,5,4 или 5,4,3? – MrSmith42