Быстрый способ частично сортировать объекты

У меня есть процедура, в которой я определяю группу объектов (около 20), называю их Jet, которые имеют определенный < что я использую, чтобы отсортировать их. После того, как они отсортированы, я беру два самых низких. Какой быстрый способ сделать это? Варианты, о которых я думал до сих пор:

  1. boost::ptr_vector<Jet> использовать встроенный .sort()возьми первые два,
  2. boost::ptr_list<Jet>использовать .sort()возьми первые два
  3. используйте список, как указано выше, но вместо сортировки используйте max_element, удалите элемент и снова запустите.

Я предполагаю, используя std::vector<Jet> будет худшим вариантом, потому что: мне не нужен произвольный доступ; сортировка будет перемещать объекты в памяти; и объекты будут скопированы при вызове push_back(Jet), Из-за необходимости копирования, я бы также предположил, что std::list<Jet> будет хуже чем boost::ptr_list<Jet>, Я также предположил бы, что принимая max_element дважды будет быстрее, чем сортировка всего списка.

Моя логика звучит? Будет ли разница в производительности существенной? Есть ли какой-то другой вариант, о котором я не думаю?

3 ответа

Решение

Есть стандартный алгоритм библиотеки, чтобы сделать именно это:

std::vector<Jet> v;
// populate v
std::partial_sort(v.begin(), v.begin() + 2, v.end());

v[0] теперь самый маленький элемент и v[1] теперь второй наименьший элемент; остальные элементы находятся в неуказанном порядке. std::vector<> можно заменить на std::deque<>, так как последний также имеет итераторы с произвольным доступом.

(Обратите внимание, что сложность, упомянутая на странице, на которую я ссылаюсь, неверна; C++11 §25.4.1.3 говорит, что сложность (last - first) * log(middle - first).)

Одно из ваших предположений верно: хранение указателей вместо объектов будет быстрее.

Однако, если вам нужны только два самых маленьких элемента, вам не нужно ничего сортировать. Просто возьмите первые два элемента, а затем переберите элементы vector или же list и сохранить меньшие.

Если вам нужны два младших объекта, вы можете создать свою собственную функцию поиска, которая будет выполняться за O(N) времени. Использование сортировки - O(N log N) времени.

Другие вопросы по тегам