Java 通过密钥区分优先级队列堆的时间复杂度

Java 通过密钥区分优先级队列堆的时间复杂度,java,heap,binary-tree,scheduling,priority-queue,Java,Heap,Binary Tree,Scheduling,Priority Queue,我有一个优先级队列最大堆,其中每个元素都是一个名为Task的类,如下所示(用Java实现,但问题是语言无关): 堆显然是按优先级排序的。我要执行的操作是查找优先级最高的项,减小其时间值,如果时间分数更改为0,则将其从堆中移除。然而,这里有一个陷阱:允许有多个具有相同优先级的任务。在这种情况下,我比较了所有这些任务的ID得分,并在最低的任务上操作 这种操作的最坏运行时间是多少?如果每个元素都有相同的优先级,我会搜索整个树,这意味着这不可能在少于O(n)的时间内完成,对吗?这似乎是不可能的,因为ID

我有一个优先级队列最大堆,其中每个元素都是一个名为Task的类,如下所示(用Java实现,但问题是语言无关):

堆显然是按优先级排序的。我要执行的操作是查找优先级最高的项,减小其时间值,如果时间分数更改为0,则将其从堆中移除。然而,这里有一个陷阱:允许有多个具有相同优先级的任务。在这种情况下,我比较了所有这些任务的ID得分,并在最低的任务上操作


这种操作的最坏运行时间是多少?如果每个元素都有相同的优先级,我会搜索整个树,这意味着这不可能在少于O(n)的时间内完成,对吗?这似乎是不可能的,因为ID是未排序的。然而,有人告诉我,这可以在O(logn)中实现,我完全不理解这一点。有人能澄清我在哪里弄错了吗?A
java.util.PriorityQueue
(属于
任务
实例)可以使用一个
比较器
,该比较器可以考虑
任务#优先级
任务#ID
,这意味着(优先级)关系可能会基于当前的ID被打破(假定)唯一。因此,任务
t1(优先级=5,ID=100,时间=10)
可以优先于任务
t2(优先级=5,ID=110,时间=10)


删除具有最高优先级的项(位于根目录下)以及其他具有相同优先级的项,剩余零时间最低ID仍然是堆或优先级队列中的
O(log(n))
操作,同时维护heap属性。请注意,优先级队列不适合搜索(哈希表或二进制搜索树可以很好地执行此操作);但是在维护heap属性的同时插入或删除。您应该只使用和API方法来实现所需的操作,同时确保时间复杂性(
O(log n)
)优先级队列的设计目的。

您选择的标记没有太多的跟随者,我建议您使用语言标记,即使问题是语言不可知。我应该澄清我没有使用PriorityQueue,我将堆存储在一个数组中。但是您的回答让我想到,我可以为插入添加一个附加条件如果优先级相同,则会将较低的ID推上堆。然后每次都必须对根进行上述操作。这不是一个直接的答案,但您让我朝着正确的方向思考,所以谢谢!在我不使用PriorityQueue实用程序的意义上,我从头开始创建了实现。我是一个PriorityQueue也使用数组,这本可以用更好的措辞。
class Task{

    int ID
    int Priority
    int Time

    public Task(int i, int p, int t){
        this.ID = i;
        this.Priority = p;
        this.Time = t;
    }

    //Getters, etc
}