java.util.PriorityQueue
允许在构造时传递一个Comparator
。插入元素时,它们根据比较器指定的优先级进行排序。
当元素的优先级在插入后发生变化时会发生什么?PriorityQueue
何时重新排序元素?是否可能轮询具有非最小优先级的元素?
是否有好的优先队列实现可以允许高效地更新优先级?
java.util.PriorityQueue
允许在构造时传递一个Comparator
。插入元素时,它们根据比较器指定的优先级进行排序。
当元素的优先级在插入后发生变化时会发生什么?PriorityQueue
何时重新排序元素?是否可能轮询具有非最小优先级的元素?
是否有好的优先队列实现可以允许高效地更新优先级?
你应该移除元素,修改它,然后重新插入,因为排序是在插入时发生的。虽然这涉及到几个步骤,但可能已经足够好了(我刚注意到关于移除的O(n)注释)。
一个问题是,当你移除元素时,它也会重新排序,如果你只是马上重新插入它,那么这是多余的。如果你从头开始实现自己的优先队列,你可以有一个update()跳过这一步,但扩展Java的类不起作用,因为你仍然受限于基础提供的remove()和add()。
我认为PriorityQueue
不应该重新排序 - 如果尝试二分查找以找到放置新条目的正确位置,则可能会非常困惑。
一般来说,我认为更改已在队列中的某个东西的优先级是一个坏主意,就像更改哈希表中组成键的值一样。