我有一个优先级队列最大堆,其中每个元素都是一个名为Task的类,它看起来如下(用Java实现,但问题与语言无关):
class Task {
int ID int优先级 …
一个 java.util.PriorityQueue (的 Task 实例) 构造函数 可以拿一个 Comparator 这可以考虑到 Task#Priority 和 Task#ID 这意味着(优先级)关系可以根据(假设)唯一的ID来打破。所以,一个任务 t1(Priority=5, ID=100, Time=10) 可以在任务之前(即优先于) t2(Priority=5, ID=110, Time=10) 。
java.util.PriorityQueue
Task
Comparator
Task#Priority
Task#ID
t1(Priority=5, ID=100, Time=10)
t2(Priority=5, ID=110, Time=10)
删除具有最高优先级的此类项目(位于根目录)以及可能具有相同优先级的其他项目,零剩余时间 的 和 强> 最低ID仍然是 O(log(n)) 在保持堆属性的同时在堆或优先级队列中进行操作。请注意,优先级队列不是很好 搜索 (哈希表或二进制搜索树做得那么好);但是在保持堆属性的同时插入或删除。你应该只使用 peek 和 remove API方法实现您需要的操作,同时确保时间复杂度( O(log n) )优先级队列的设计目的。
O(log(n))
peek
remove
O(log n)