jdk源码剖析PriorityQueueITeye - AG环亚娱乐集团

jdk源码剖析PriorityQueueITeye

2019-01-11 13:50:45 | 作者: 新曦 | 标签: 元素,节点,刺进 | 浏览: 3086

PriorityQueue是一个堆,恣意节点都是以它为根节点的子树中的最小节点 堆的逻辑结构是彻底二叉树状的,存储结构是用数组去存储的,随机拜访性好。最小堆的根元素是最小的,最大堆的根元素是最大的 550265677348132602 这是他的存储结构,是用数组来存储的。 能够看到,i下标的数组元素,他的父节点是(i-1)/2,他的左右节点分别是i*2+1,i*2+2 2.1初始容量11 2.2扩展容量
 private void grow(int minCapacity) {
 int oldCapacity = queue.length;
 // Double size if small; else grow by 50%
 int newCapacity = oldCapacity + ((oldCapacity 64) ? (oldCapacity + 2) : (oldCapacity 1));
 // overflow-conscious code
 if (newCapacity - MAX_ARRAY_SIZE 0)
 newCapacity = hugeCapacity(minCapacity);
 queue = Arrays.copyOf(queue, newCapacity);
当容量缺乏的时分,会调用此办法,假如当时容量较小(小于64),则将容量增大一倍+2,假如当时容量较大,则容量增大一半 刺进元素会调用siftUp办法。
 private void siftUpComparable(int k, E x) {
 Comparable ? super E key = (Comparable ? super E 
 while (k 0) {
 int parent = (k - 1) 
 Object e = queue[parent];
 if (key.compareTo((E) e) = 0)
 break;
 queue[k] = e;
 k = parent;
 queue[k] = key;
当优先行列不指定比较器的时分,刺进元素,会调用siftUpComparable k表明元素即将刺进的方位 这个办法的意思是,在以k为子节点的子树刺进元素x,并坚持该子树的次序。(把k看作这个子树的叶子节点) step1:得出父元素的下标 strp2:计算出要刺进元素的方位k。假如刺进元素大于父元素,将父元素移动到k的方位,k移动到其父元素,并从第一步开端循环履行 step3:在k的方位刺进元素
 private void siftDownComparable(int k, E x) {
 Comparable ? super E key = (Comparable ? super E 
 int half = size // loop while a non-leaf
 while (k half) {
 int child = (k 1) + 1; // assume left child is least
 Object c = queue[child];
 int right = child + 1;
 if (right size 
 ((Comparable ? super E ) c).compareTo((E) queue[right]) 0)
 c = queue[child = right];
 if (key.compareTo((E) c) = 0)
 break;
 queue[k] = c;
 k = child;
 queue[k] = key;
删去会调用这个办法。删去都是将队尾的元素替换掉删去掉的方位 k表明元素即将刺进的方位 这个办法的意思是,在k的子树刺进元素x,并坚持k方位子树的次序(x是其子树的最小节点)。(把k看作这个子树的根节点) 这儿要注意,像这种二叉树结构,下标大于size 2都是叶子节点,其他的节点都有子节点。所以注意到循环条件,假如k是叶子节点的下标,则直接替换,由于其现已没有子树了,那么必定是以其为根节点的最小元素 step1:算出k的左右节点的下标 step2:假如k大于左右节点中的最小一个,则k与最小的节点交换方位,并循环step1 step3:在k方位赋值x



检查原文:http://blog.zswlib.com/2016/10/31/jdk%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90priorityqueue/

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章