堆 (java)

一、定义

是子节点小(大)于父节点的完全二叉树(非线性/一维数组)。

  • 堆中某个节点的值总是不大于(或不小于)其父节点的值;

  • 堆总是一棵 完全二叉树(设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边)。

根节点最大的堆叫做最大堆(大根堆);根节点最小的堆叫做最小堆(小根堆)。

二、Java实现

用PriorityQueue实现最大(小)堆,一个基于优先级堆(*1)的无界优先级队列。

实际上是一个堆(不指定Comparator时默认为最小堆),通过传入自定义的Comparator函数可以实现大顶堆。

1

2

3

4

5

6

7

PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); //小顶堆,默认容量为11

PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11,new Comparator<Integer>(){ //大顶堆,容量11

    @Override

    public int compare(Integer i1,Integer i2){

        return i2-i1;

    }

});

PriorityQueue的常用方法有:poll(),offer(Object),size(),peek()等。

  •   插入方法(offer()、poll()、remove() 、add() 方法)时间复杂度为O(log(n)) ;
  •   remove(Object) 和 contains(Object) 时间复杂度为O(n);
  •   检索方法(peek、element 和 size)时间复杂度为常量。

*1:优先队列,又称为优先级队列、堆。优先队列是一种特殊的队列,除了具有队列的先入先出,队列头出,队列尾入的结构特点,优先队列最重要的就是要实现快速得到队列中优先级最高的元素,因此,优先队列有一定的顺序特点,这是一种弱序,即队列头部的那个元素是优先级最高的,我们往往以元素值的大小作为优先级来...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值