美文网首页
PriorityQueue 优先队列 -- 小顶堆

PriorityQueue 优先队列 -- 小顶堆

作者: 佛说子曰道道 | 来源:发表于2022-08-25 16:51 被阅读0次

优先的含义

PriorityQueue 中,会保证数组中第一个元素是数组的最大值,对于其他的元素大小顺序并不保证。

怎么加进去的

private static <T> void siftUpComparable(int k, T x, Object[] es) {
        Comparable<? super T> key = (Comparable<? super T>) x;
        while (k > 0) {
            int parent = (k - 1) >>> 1;
            Object e = es[parent];
            if (key.compareTo((T) e) >= 0)
                break;
            es[k] = e;
            k = parent;
        }
        es[k] = key;
    }

这里对外提供了两个加入的接口 add & offer。最终的都是调用的上面的代码。k就是当前数组的末尾索引,x就是要加进来的索引,es就是当前的数组。这里没有指定比较器,就是使用的默认比较方法(Comparable接口的实现类都会有比较大小的方法)。

image.png

(k-1)>>>1 代表什么呢?也就是无符号右移一位,也就是除以2。由于数组索引为0,所以-1也就那么回事。所以为什么最后的名称是parent,也就可以解释了。
那么进入判断

 if (key.compareTo((T) e) >= 0)     break;

e就是当前数组中包含的值,所以如果要插入的key >= e,那么不用考虑,直接让key在下面呆着吧,他上不去。
如果是key<e呢,说明这个e需要把位置让给key,因为他更大。那么e就是放到了key的位置。key当然也不是一定就在e原来的位置,因为循环还没有结束。
最终key把比他大的全部搞下去,他上位了!所以说最后只有第一个元素是最小的,其他元素无序。

相关文章

  • PriorityQueue源码学习

    PriorityQueue源码学习 使用堆来实现一个优先级队列,comapreTo()比较最小的那个放在堆顶,每次...

  • java源码-PriorityQueue

    开篇  PriorityQueue是具备了小根堆性质的数据结构也就是优先队列PriorityQueue,内部实现是...

  • 【二】优先队列和堆

    堆 ----待补充--- java中的优先队列 PriorityQueue为java中的优先队列((a,b)->b...

  • PriorityQueue优先队列

    基于堆排实现优先队列 死磕 java集合之PriorityQueue源码分析

  • 查找算法:小顶堆、二叉树

    小顶堆 PriorityQueue\DelayedWorkQueue\PriorityBlockingQueue小...

  • 数据结构系列x-堆

    Heap 堆 参照 一个优先级队列。PriorityQueue便是根据堆来实现的 找出前K个数(从大到小),构建一...

  • PriorityQueue 源码分析

    PriorityQueue 一个无限的优先级队列基于一个优先级堆。优先级队列中的元素根据它们的Comparable...

  • webrtc MessageQueue 处理过程

    PriorityQueue dmsgq_;//优先队列 优先队列继承自 std::priority_queueDe...

  • java笔记

    [java优先队列PriorityQueue的使用] PriorityQueue弹出优先级最高的元素,优先级的比较...

  • 堆的应用

    堆的应用一:优先级队列 将优先级的之分的数据存入堆中(小顶堆或者大顶堆),堆顶即优先级最搞的数据,当需要的时候直接...

网友评论

      本文标题:PriorityQueue 优先队列 -- 小顶堆

      本文链接:https://www.haomeiwen.com/subject/dmatnrtx.html