Я реализовал высокопроизводительную обновляемую очередь с приоритетами и сделал ее доступной на github .
Вот как вы обычно его используете:
better_priority_queue::updatable_priority_queue<int,int> pQ;
pQ.push(0, 30); // or pQ.set(0, 30)
pQ.push(1, 20);
pQ.push(2, 10);
pQ.update(2, 25); // or pQ.set(2, 25)
while(!pQ.empty())
std::cout << pQ.pop_value().key << ' ';
// Outputs: 0 2 1
Чтобы дополнить ответ Ярекчека, если действительно подходы set
и «чистая куча с бесполезными записями» имеют одинаковую сложность, версия stl::set
обычно работает намного медленнее, чем версия stl::priority_queue
, из-за того, что реализован с красно-черными деревьями, которые гарантируют, что их глубина будет меньше 2 * log_2 (n_elements) и требуют регулярных обновлений, в то время как stl::priority_queue
является настолько чистой и быстрой двоичной кучей, насколько это возможно. Вот почему он обычно используется при реализации Dijkstra.
Однако заданный подход может быть быстрее при выполнении большого количества обновлений на нескольких базовых узлах. Это также, где использование моей библиотеки принесет вам наибольшее улучшение.