Приоритетные очереди в Java

java.util.PriorityQueue разрешает Comparator для передачи во время разработки. При вставке элементы упорядочиваются в соответствии с приоритетом, заданным компаратором.

Что происходит, когда приоритет элемента изменяется после его вставки? Когда PriorityQueue переупорядочивает элементы? Можно ли опросить элемент, который на самом деле не имеет минимального приоритета?

Существуют ли хорошие реализации очереди приоритетов, позволяющие эффективно обновлять приоритеты?


person D-Bug    schedule 07.07.2009    source источник
comment
Могу я спросить, какое решение вы выбрали? У меня похожая, но в то же время совсем другая проблема, когда мне нужно пересчитать приоритеты всех записей в соответствии с оставшимся временем (планирование наименьшего резервного времени).   -  person Marko Bonaci    schedule 30.06.2013


Ответы (2)


Вы должны удалить элемент, изменить его и снова вставить, так как упорядочение происходит при его вставке. Хотя он включает в себя несколько шагов, он эффективен и может быть достаточно хорош. (Я только что заметил комментарий об удалении O (n).)

Одна проблема заключается в том, что он также изменит порядок, когда вы удалите элемент, что является излишним, если вы просто собираетесь повторно вставить его через мгновение. Если вы реализуете свою очередь приоритетов с нуля, у вас может быть функция update(), пропускающая этот шаг, но расширение класса Java не будет работать, поскольку вы по-прежнему ограничены функциями remove() и add(), предоставляемыми базой.

person Community    schedule 07.07.2009

Я бы ожидал, что PriorityQueue не будет переупорядочивать вещи, и он может сильно запутаться, если попытается выполнить бинарный поиск, чтобы найти правильное место для размещения любых новых записей.

Вообще говоря, я ожидаю, что изменение приоритета чего-либо, уже находящегося в очереди, будет плохой идеей, точно так же, как изменение значений, составляющих ключ в хеш-таблице.

person Jon Skeet    schedule 07.07.2009
comment
Для некоторых алгоритмов (например, алгоритма Дейкстры) было бы очень полезно иметь возможность изменять приоритет чего-либо, уже находящегося в очереди. - person D-Bug; 07.07.2009
comment
Но должно быть уведомление об этом. Вы можете подделать это без какой-либо помощи PriorityQueue, удалив и повторно добавив элемент, если он меняет приоритет. - person Jon Skeet; 07.07.2009
comment
@Jon, поправьте меня, если я ошибаюсь, но я считаю, что удаление - это O (n) для реализации sun, поэтому в итоге получается O (n log n), тогда как если бы вы могли обновить внутренне, это было бы просто O (log n) . Казалось бы, возможность принудительного обновления была бы неплохой. - person Alex Beardsley; 28.07.2009
comment
@Nalandial: Да, вы правы - мне кажется, что для больших очередей реализация дерева будет быстрее ... - person Jon Skeet; 28.07.2009