У меня есть приложение (C ++), которое, я думаю, будет хорошо обслуживаться STL priority_queue
. В документации говорится:
Priority_queue - это адаптер контейнера, что означает, что он реализован поверх некоторого базового типа контейнера. По умолчанию этот базовый тип является векторным, но можно явно выбрать другой тип.
и
Очереди приоритета - это стандартная концепция, которая может быть реализована множеством различных способов; эта реализация использует кучи.
Ранее я предполагал, что top()
равно O(1)
, а push()
будет O(logn)
(две причины, по которым я выбрал priority_queue
в первую очередь), но документация не подтверждает и не опровергает это предположение.
Если копнуть глубже, в документации по концепции Sequence говорится:
Сложность одноэлементной вставки и стирания зависит от последовательности.
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 .: Меня здесь беспокоит эффективность времени, а не пространство.