堆的概念我们就介绍到这里,不做深究,下面我们来看看我们今天的主角PriorityQueue,它的本质其实就是堆的实现(大根堆,小根堆)。下面我们通过PriorityQueue源码,来分析一下它的实现和使用,我们先假设元素值越小优先级越高。(具体优先级大小是通过实现了Comparable接口对象的compareTo方法或者自定义的Comparator比较器决定的)。
大根堆:采用数组存储树,是一个完全树。先插入到数组最后的位置上,然后采用上浮的思想,将该元素与比它小的父元素调换,直到parent>target,浮到root;然后将root与未排序的最后一个元素交换位置;重复以上步骤,直到所有元素都有序。插入如查找的复杂度都是log(n)。 优先队列PriorityQueue,Java中使用小根堆实现,非线程安全。
7. PriorityQueue默认情况下是小堆---即每次获取到的元素都是最小的元素 建一个优先级队列并测试 public static void main(String[] args) { PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(); priorityQueue.offer(100); priorityQueue.offer(2); priorityQueue.offer(3); System.out.println(priority...
,也就是二叉树的高度 6. PriorityQueue底层使用了堆数据结构 7. PriorityQueue默认情况下是小堆---即每次获取到的元素都是最小的元素 //检验一下 PriorityQueue 真的默认为小根堆? public static void main(String[] args) { Queue<Integer> priorityQueue = new PriorityQueue<>(); priorityQueue.offer(1); pri...
PriorityQueue PriorityQueue默认小根堆,要想生成大根堆,可以按照如下方式生成。 PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((x,y) -> (y-x)); 1. 基本操作 PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(); priorityQueue.offer(1); //插入元素 priorityQueue.offer(2); priorityQueue...
大根堆指父节点值总是比其子节点值大;小根堆指父节点值总是比其子节点值小。如下是一个大根堆:每个父节点的值都比其子节点值大。如下是一个小根堆:每个父节点的值都比其子节点值小。一个大根堆,其根节点总是所有节点中最大值; 一个小根堆,其根节点总是所有节点中最小值。例如上面大根堆中99为最大值,...