什么是堆(用数组实现的二叉树)

  • 通过有序的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 个节点

image.png

  • 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);

ysysys
10 声望1 粉丝