У меня есть приложение (С++), которое, я думаю, будет хорошо обслуживаться STL priority_queue. В документации говорится:
Priority_queue - это адаптер контейнера, что означает, что он реализован поверх некоторого базового типа контейнера. По умолчанию этот базовый тип является вектором, но явно может быть выбран другой тип.
и
Приоритетные очереди являются стандартной концепцией и могут быть реализованы различными способами; эта реализация использует кучи.
Ранее я предполагал, что top() - O(1), и что push() будет O(logn) (две причины, по которым я выбрал priority_queue), но документация не подтверждает и не отрицает это предположение.
Копая глубже, в документах для концепции Sequence говорится:
Сложности одноэлементной вставки и стирания зависят от последовательности.
В priority_queue используется vector (по умолчанию) как куча, которая:
... поддерживает произвольный доступ к элементам, постоянную вставку времени и удаление элементов в конце и линейную установку времени и удаление элементов в начале или в середине.
Я предполагаю, что по умолчанию priority_queue, top() есть O(1) и push() is O(n).
Вопрос 1: Правильно ли это? (top() доступ - O(1) и push() - O(n)?)
Вопрос 2:. Я мог бы достичь эффективности O(logn) на push(), если я использовал set (или multiset) вместо vector для реализации priority_queue? Каковы будут последствия этого? Какие другие операции могут пострадать в результате?
N.B.: Меня беспокоит эффективность времени, а не пространство.