Иногда во время конкурсов программирования и т.д. нам нужна простая рабочая реализация очереди с минимальным приоритетом с помощью клавиши уменьшения для реализации алгоритма Дейкстры и т.д. Я часто использую set < пара < key_value, идентификатор → и массив (идентификатор сопоставления → key_value) вместе для достижения этого.
-
Добавление элемента в набор занимает время O (log (N)). Чтобы построить приоритетную очередь из N элементов, мы просто добавляем их по одному в набор. Это занимает общее время O (N log (N)).
-
Элемент с min key_value - это просто первый элемент набора. Пробывание наименьшего элемента занимает O (1) раз. Для удаления требуется время O (log (N)).
-
Чтобы проверить, установлен ли какой-либо ID = k в наборе, сначала рассмотрим его key_value = v_k в массиве, а затем выполните поиск элемента (v_k, k) в наборе. Это занимает время O (log (N)).
-
Чтобы изменить значение key_value некоторого ID = k из v_k в v_k ', сначала рассмотрим его key_value = v_k в массиве, а затем выполните поиск элемента (v_k, k) в наборе. Затем мы удалим этот элемент из набора, а затем вставим элемент (v_k ', k) в набор. Затем мы также обновляем массив. Это занимает время O (log (N)).
Хотя вышеупомянутый подход работает, большинство учебников обычно рекомендуют использовать двоичные кучи для реализации очередей приоритетов, так как время построения двоичных куч - это просто O (N). Я слышал, что в STL С++ есть встроенная структура данных очереди приоритетов, которая использует двоичные кучи. Однако я не уверен, как обновить значение key_value для этой структуры данных.
Какой самый простой и эффективный способ использования очереди минимального приоритета с обновлением ключа в С++?