又一基础数据结构的整理,知识需要不停的回顾与学习。
(此处的heap指binary heap, 且是最小堆)
性质
structure
complete binary tree
order
根节点的值 <= 叶节点的值
实现
数组实现(完全二叉树的表示方式)
- 根节点放在A[1] (A[0]不使用)
- A[x]的子节点为A[2x]以及A[2x + 1]
操作
Insert O(logN)
从最后向上找,找到适合放入插入值的位置放入。
|
|
DeleteMin O(logN)
从根节点出发,找到适合放入最后一个元素的位置放入。
|
|
Build
Naive O(NlogN)
做n次插入操作
|
|
O(N)
由下向上,依次进行heapify操作。
时间复杂度分析:
- 对于高度为h的heapify操作:O(h)
- 每一层高度为h的最多的节点:$\lceil\frac{n}{2^{h + 1}}\rceil$
- 两者相乘累加
|
|
|
|
Merge
放到一起,build heap…
相关题目
K-th largest element problem
LeetCode 215. Kth Largest Element in an Array
很经典的题目,用heap可以做,也可以用类似快排那样划分的方式做,似乎有更好的表现,因为每次只用考虑一般,是O(N)的时间复杂度。
Heap Method:
|
|
Partition Method:
|
|
Top K Frequent
LeetCode 692. Top K Frequent Words
这个题,题目一般,不够经典,但是记下来用于回顾cpp标准库中的priority_queue
的使用,包括自己写comparator等。
注意些comparator时判断的符号!!!
记住,默认排序的时候,排升序,默认用小于号比较,其它的基于这个可以推出。
比如这道题,是最大堆,所以应该是”排降序“,用大于号。
|
|