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