数据结构 | 入队 | 出队 |
---|---|---|
普通线性结构 | O(1) | O(N) |
顺序线性结构 | O(N) | O(1) |
堆 | O(logn) | O(logn) |
数组实现堆
1 | public class MaxHeap<E extends Comparable<E>> { |
Sift Up 上浮
1 | public void add(E e) { |
Sift Down
1 | public E findMax() { |
Replace
- 取出最大元素之后,放入一个新的元素
- 实现: 可以先extractMax,在add,两次O(logn)的操作
- 实现: 可以直接将堆顶替换之后进行siftDown,一次O(logn)的操作
1 | public E replace(E e) { |
Heapify
- 将任意的数组整理成堆的形状
- 实现:从最后一个非叶子节点之前的元素进行siftdown操作。
- 找到最后一个非叶子节点,就是最后一个节点的父亲节点。
1 | public MaxHeap(E[] arr) { |
优先队列PriorityQueue
1 | public class PriorityQueue<E extends Comparabel<E>> implements Queue { |
在N个元素中选出前M大个元素?
1 | class Solution { |
比较器实现
1 | // 使用匿名内部类简化代码 |