У меня есть приложение (С++), которое, я думаю, будет хорошо обслуживаться 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.: Меня беспокоит эффективность времени, а не пространство.