当前位置: 首页 > 知识库问答 >
问题:

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

宰父志新
2023-03-14

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

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
}

堆显然是按优先级排序的。我要执行的操作是查找优先级最高的项目,递减其 Time 值,并在时间分数更改为 0 时将其从堆中删除。但是,这里有一个问题:允许有多个具有相同优先级的任务。在这种情况下,我比较所有此类任务的ID分数,并对最低的任务进行操作。

此类操作的最坏运行时间是多少?如果每个元素都有相同的优先级,我最终会搜索整个树,这意味着这不可能在少于O(n)的时间内完成,对吗?这似乎是不可能的,因为ID是未排序的。但是,我被告知这可以在O(log n)中完成,我完全不明白。有谁能澄清我在哪里错了?

共有1个答案

岳曦
2023-03-14

Java.util.PriorityQueue任务实例)构造函数可以采用一个比较器,该比较器可以考虑任务#优先级任务#ID,这意味着(优先级)关系可以根据ID(假定)唯一的ID被破坏。因此,任务 t1(优先级 = 5,ID = 100,时间 = 10)可以位于(即优先于)任务 t2(优先级 = 5,ID = 110,时间 = 10)之前。

删除具有最高优先级的项(位于根)以及其他具有相同优先级、零剩余时间和最低ID的项仍然是堆或优先级队列中的<code>O(log(n))

 类似资料:
  • 构建堆的时间复杂度为O(n)。问题是Java优先级队列是否可以实现它?让我们举一个例子: ... 现在我们可以看到,它将按照自然顺序进行排序,即递增顺序。Java没有一个构造函数既接受列表又接受比较器。如果我想创建Max Heap,则如下所示: ... ... 如果我想使用PriorityQueue对自定义类进行排序,那么它将永远无法实现构建堆O(n)。或者我们可以吗?

  • 创建堆需要时间,而插入堆(或优先级队列)需要时间。 取n个输入并将其插入优先级队列,操作的时间复杂度是多少?O(n)或O(n*log(n))。 此外,如果清空整个堆(即n个删除),同样的结果也成立,对吧?

  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 我正在编写一个涉及堆实现的代码,在我的bubbleUp方法中,在我的while循环行中,我似乎遇到了一个取消引用的错误。这可能是一个相当基本的问题,但解决这个问题的最佳方法是什么?我在实现removeHigh方法时也遇到了一些问题,该方法旨在从队列中移除最高的元素。

  • 我用的是邻接矩阵,优先队列是数据结构。 根据我的计算,复杂度为: 同时循环: 检查相邻顶点: 检查队列是否条目已经存在,并更新相同的: 但是,我到处都读到复杂性是 请解释。

  • 问题内容: 我正在尝试根据文档中提供的示例实现优先级队列。文件:priorityQueue 简而言之,它看起来像这样(不包括所有内容): 该文件中: 如您所见,在与示例进行比较时,我不使用指针,因为这样做会给我一个编译错误,告诉我我的优先级队列未正确实现接口。 这会给我带来以下问题: 该项目未附加到队列中。 我试图写出队列指针地址,它显示了不同的地址。这就解释了为什么它不起作用,但是切片不是地图长