一、定义
堆是子节点小(大)于父节点的完全二叉树(非线性/一维数组)。
-
堆中某个节点的值总是不大于(或不小于)其父节点的值;
-
堆总是一棵 完全二叉树(设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边)。
根节点最大的堆叫做最大堆(大根堆);根节点最小的堆叫做最小堆(小根堆)。
二、Java实现
用PriorityQueue实现最大(小)堆,一个基于优先级堆(*1)的无界优先级队列。
实际上是一个堆(不指定Comparator时默认为最小堆),通过传入自定义的Comparator函数可以实现大顶堆。
1 2 3 4 5 6 7 |
|
PriorityQueue的常用方法有:poll(),offer(Object),size(),peek()等。
- 插入方法(offer()、poll()、remove() 、add() 方法)时间复杂度为O(log(n)) ;
- remove(Object) 和 contains(Object) 时间复杂度为O(n);
- 检索方法(peek、element 和 size)时间复杂度为常量。
*1:优先队列,又称为优先级队列、堆。优先队列是一种特殊的队列,除了具有队列的先入先出,队列头出,队列尾入的结构特点,优先队列最重要的就是要实现快速得到队列中优先级最高的元素,因此,优先队列有一定的顺序特点,这是一种弱序,即队列头部的那个元素是优先级最高的,我们往往以元素值的大小作为优先级来...