当前位置: 首页 > 面试题库 >

元素的优先队列排序

屠锦
2023-03-14
问题内容

默认情况下,优先级队列的元素如何按照自然顺序排序,因为它没有实现可比的接口。

从文档中可以看出,元素是根据自然顺序进行排序的,但是我找不到任何关于equals方法或可比性的东西。它在内部如何发生?

所有实现的接口:可序列化,可迭代,集合,队列。

如果它实现可比性,那么为什么不在上一行说

例:

    public static void main(String[] args) {
        PriorityQueue<String> pq = new PriorityQueue<String>();
        pq.add("2");
        pq.add("4");
        System.out.println(pq); //prints [2, 4]
        pq.offer("1");
        System.out.println(pq); // prints [1, 4, 2]
        pq.add("3");
        System.out.println(pq); // prints [1, 3, 2, 4]
    }
}

第三条打印语句也将打印[1、3、2、4],而不是打印[1、2、3、4]。为什么?应该自然排序吧?


问题答案:

其实内部的数据结构PriorityQueue不是有序的,它是一个

PriorityQueue不需要排序,而是专注于数据 。插入时间为 O(log n) 。排序浪费时间,对队列毫无用处。

此外,提供元素is -a Comparable或a Comparator。不幸的是,不可比较的检查是在 运行
时而不是编译时进行的。一旦添加第二个元素,ClassCastException就会发生。

加:我对 为什么[ 1、3、2、4 ]而不打印[1、2、3、4]的 回答?

正如我之前提到的,它不是有序的,而是集中在q[0]最小的头部上,仅此而已。您可能会看到[1、3、2、4]是一棵不是线性的树:

1
| \
3  2
|
4


 类似资料:
  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。

  • 我正在尝试在滑动窗口中打印最大值。将窗口大小的元素,这里k=3放入优先级队列(Maxheap),然后查看值。”heap.Init(

  • 我在这个问题上发现了一些类似的问题,但我想再问一遍,以便得到一个更明确的答案。我正在编写一个图匹配算法,其中图上的每个节点分配给一个优先级集,取决于其邻居的匹配。细节其实并不重要,但我使用了std::priority_queue以便首先匹配最高优先级的节点。这里有一个棘手的问题:每次引入一个新的匹配,匹配节点的邻居的优先级将被更新。 我的问题自然是,如何更新新匹配的顺序?我能强制执行吗?或者是否有

  • 下面是我的代码: 我将再次指出,如果我使用队列而不是优先级队列,那么代码可以工作。如何访问优先级队列的前部?

  • 我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。

  • 我有一个priority_queue,我想修改它的一些内容(优先级值),那么这个队列会被使用吗? 这取决于它是使用Push/Pop(更有可能,因为你只需要“插入”,而不是整个使用),还是访问top或Pop。 我很想更改队列中的一些元素。大概是这样的: