默认情况下,优先级队列的元素如何按照自然顺序排序,因为它没有实现可比的接口。
从文档中可以看出,元素是根据自然顺序进行排序的,但是我找不到任何关于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。 我很想更改队列中的一些元素。大概是这样的: