Jef*_*hen 48 java priority-queue
PriorityQueue
如果你不能insertWithPriority,他们为什么命名?它看起来非常类似于堆.有什么不同吗?如果没有区别,那为什么它被命名PriorityQueue
而不是Heap?
Bin*_*eng 73
默认的PriorityQueue是使用Min-Heap实现的,即top元素是堆中的最小元素.
为了实现max-heap,您可以创建自己的Comparator:
import java.util.Comparator;
public class MyComparator implements Comparator<Integer>
{
public int compare( Integer x, Integer y )
{
return y - x;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以通过以下方式创建最小堆和最大堆:
PriorityQueue minHeap=new PriorityQueue();
PriorityQueue maxHeap=new PriorityQueue(size, new MyComparator());
Run Code Online (Sandbox Code Playgroud)
Hen*_*meh 40
对于max-heap,您可以使用:
PriorityQueue<Integer> queue = new PriorityQueue<>(10, Collections.reverseOrder());
Run Code Online (Sandbox Code Playgroud)
Mar*_*elo 24
Add()的工作方式类似于insertWithPriority.
您可以使用构造函数定义所需类型的优先级:
PriorityQueue(int, java.util.Comparator)
Run Code Online (Sandbox Code Playgroud)
请查看http://download.oracle.com/javase/1,5.0/docs/api/java/util/PriorityQueue.html
Comparator提供的顺序将代表队列中的优先级.
Gau*_*wat 10
其他答案中描述的默认行为
最小堆(默认):
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
Run Code Online (Sandbox Code Playgroud)
对于最大堆:
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((o1, o2) -> o2-o1);
Run Code Online (Sandbox Code Playgroud)
来自Java 文档
优先级队列表示为平衡二叉堆:queue[n] 的两个子级是queue[2*n+1] 和queue[2*(n+1)]。优先级队列按比较器或元素的自然顺序排序。
这是maxHeap和minHeap的工作代码,使用PriorityQueue
-
class HeapDemo {
private final static int HEAP_SIZE = 10; //size of heap
//INNER CLASS
static class maxHeapComparator implements Comparator<Integer> {
@Override
public int compare (Integer x, Integer y) {
return y-x; //reverse order
}
}
public static void main(String[] args) {
PriorityQueue<Integer> minHeap = new PriorityQueue<>(HeapDemo.HEAP_SIZE);
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(HeapDemo.HEAP_SIZE, new maxHeapComparator());
for(int i=1; i<=HeapDemo.HEAP_SIZE; ++i){
int data = new Random().nextInt(100) +1; //number between 0 to 100
minHeap.add(data);
maxHeap.add(data);
}
System.out.print("\nMIN Heap : ");
Iterator<Integer> iter = minHeap.iterator();
while(iter.hasNext()){
System.out.print(iter.next() + " ");
}
System.out.print("\nMAX Heap : ");
iter = maxHeap.iterator();
while(iter.hasNext()) {
System.out.print(iter.next() + " ");
}
}
}
Run Code Online (Sandbox Code Playgroud)
样本操作:
MIN Heap : 20 32 37 41 53 91 41 98 47 86
MAX Heap : 98 91 41 53 86 20 37 41 32 47
Run Code Online (Sandbox Code Playgroud)