02:java.util.Queue---PriorityQueue

目录

PriorityQueue

PriorityQueue继承关系

PriorityQueue继承及依赖图

构造函数

常用API

泛型的比较

最小堆维护(MIN-HEAPIFY)

PriorityQueue

优先级队列(priority queue)中的元素可按照任意的顺序插入,却总是按照排序的顺序进行检索。优先级队列使用堆(heap)数据结构实现。---摘自《Java核心技术 卷1》

注:PriorityQueue底层实现是以数组为基础的一个最小堆的数据结构,重点包括:泛型,堆的Heapify操作。

PriorityQueue继承关系

java.lang.Object
↳     java.util.AbstractCollection<E>
   ↳     java.util.AbstractQueue<E>
       ↳     java.util.PriorityQueue<E>

PriorityQueue继承及依赖图

构造函数

public PriorityQueue()
public PriorityQueue(int initialCapacity)
public PriorityQueue(Comparator<? super E> comparator)
public PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
public PriorityQueue(Collection<? extends E> c)
public PriorityQueue(PriorityQueue<? extends E> c)
public PriorityQueue(SortedSet<? extends E> c)

常用API

方法名功能描述
add(E e)添加元素
clear()清空
contains(Object o)检查是否包含当前参数元素
offer(E e)添加元素
peek()读取元素,(不删除)
poll()取出元素,(删除)
remove(Object o)删除指定元素
size()返回长度

泛型的比较

前提条件:此泛型类参数必须继承Comparable接口,如java.lang.Integer

代码示例:比较(E) x和(E) e的大小。

Comparable<? super E> key = (Comparable<? super E>) x;
key.compareTo((E) e);// >=0:x>=e; <0:x<e;

最小堆维护(MIN-HEAPIFY)

add操作最小堆维护(siftUp),k:插入位置,x:插入数据

private void siftUpComparable(int k, E x) {// Java PriorityQueue Source
    Comparable<? super E> key = (Comparable<? super E>) x;
    while (k > 0) {
        int parent = (k - 1) >>> 1;
        Object e = queue[parent];
        if (key.compareTo((E) e) >= 0)
            break;
        queue[k] = e;
        k = parent;
    }
    queue[k] = key;
}

poll操作最小堆维护(siftDown),k:取出位置,x:末尾数据,这边是堆常用的,取出索引0的数据,然后将末尾数据填充上去,并删除末尾数据,size-1

private void siftDownComparable(int k, E x) {// Java Priority Source
    Comparable<? super E> key = (Comparable<? super E>)x;
    int half = size >>> 1;        // 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;
}

注:由最小堆的性质可见,PriorityQueue取出的数据是从小到大的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值