堆是一种特殊的树,需要满足以下两点要求:
- 堆是一个完全二叉树;
- 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值 (根据大于等于和小于等于的不同分为大顶堆和小顶堆)
堆的应用 §
- 优先级队列
- Top K问题,维护一个大小为k的小顶堆,将元素与堆顶元素比较,如果比堆顶元素大,就用元素替换堆顶元素,然后进行堆化,最后堆中元素就是最大的k个元素。
- 动态数组求中位数:维护一个大顶堆和一个小顶堆,大顶堆存储前半部分数据,小顶堆存储后半部分,且小顶堆的数据都大雨大顶堆的数据。当有新元素时,将其与大顶堆的堆顶元素比较,来决定新元素进行大顶堆还是小顶堆。