堆
什么是堆(用数组实现的二叉树)
- 通过有序的key存储value的数据结构
- 根据顺序分为大顶堆和小顶堆
- 通常用来实现优先级队列priority_queue(topk)
二叉堆
- key存在二叉树的节点中
- key必须是可排序的
- 具有堆属性,例如在最大堆中,父节点的值比每一个子节点的值都要大
- get maximum: O(1) (constant time)
- remove maximum: O(log N) (logarithmic time)
- insert: O(log N)
- increase key: O(log N)
用数组表示二叉树
- 满二叉树 共2^h-1个节点
- 完全二叉树可以被数组表示(Almost full binary trees) ,2^(h-1) -1 ~ 2^h -1 个节点

left_child_index(p) = 2 * p + 1
right_child_index(p) = 2 * p + 2
堆操作(c++用类似数组的容器表示)
- cmp 默认是 <
- make_heap(@b, @e, cmp):将键序列重新排序为二进制堆
- push_heap(@b, @e, cmp):插入一个新密钥
- pop_heap(@b, @e, @cmp):删除最大值
- sort_heap(@b, @e, @cmp):堆→排序数组
- is_heap(@b, @e, @cmp): 判断是否是heap
如果只需要一个优先级队列,使用std::priority_queue
// 用 lambda 比较元素。
auto cmp = [](int left, int right) { return (left ^ 2) < (right ^ 2); };
std::priority_queue<int, std::vector<int>, decltype(cmp)> q3(cmp);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。