Это звучит как классический вопрос для собеседования «Как хранить наименьшее N элементов без знания размера данных, которые будут обработаны?».
Один из ответов - использовать максимальную кучуN элементов, а затем настройте кучу (удалите верхний элемент, добавьте новый элемент, сложите в кучу), если последующий элемент меньше или равен самому верхнему элементу в куче.
Это легко сделатьиспользуя функции библиотеки C ++ std :: make_heap , std :: pop_heap и std :: push_heap .
Вот пример:
#include <vector>
#include <algorithm>
#include <iostream>
int main(int argc, char *argv[])
{
std::vector<int> s;
for (int i : {6, 6, 5, 8, 3, 4, 0, 2, 8, 9, 7, 2})
{
// add the first 5 elements to the vector
if (s.size() < 5)
{
s.push_back(i);
if ( s.size() == 5 )
// make the max-heap of the 5 elements
std::make_heap(s.begin(), s.end());
continue;
}
// now check if the next element is smaller than the top of the heap
if (s.front() >= i)
{
// remove the front of the heap by placing it at the end of the vector
std::pop_heap(s.begin(), s.end());
// get rid of that item now
s.pop_back();
// add the new item
s.push_back(i);
// heapify
std::push_heap(s.begin(), s.end());
}
}
// sort the heap
std::sort_heap(s.begin(), s.end());
for (int d : s)
std::cout << d << " "; //print the 5 smallest elements in ascending order
std::cout << '\n';
return 0;
}
Вывод:
0 2 2 3 4
Конечно, вы можете сделать это функцией и заменить жестко закодированный 5
на N
.
Если естьэто миллиарды элементов, т.е. гораздо больше элементов, чем N, единственное, что будет храниться в куче, это N элементов.
Максимальной кучей манипулируют только в том случае, если обнаружено, что новый элемент удовлетворяет тому, что является одним из наименьших N элементов, и это легко сделать, осмотрев верхний элемент в куче и сравнив его с новым элементом.это обрабатывается.