优先队列(堆)

优先队列(堆)

  • 堆就是用数组实现的完全二叉树
  • 所以在堆中,在当前层级所有的节点都已经填满之前不允许开是下一层的填充,所以堆总是有这样的形状

堆和二叉搜索树的区别

  • 节点的顺序。在二叉搜索树中,左子节点必须比父节点小,右子节点必须必比父节点大。但是在堆中并非如此。在最大堆中两个子节点都必须比父节点小,而在最小堆中,它们都必须比父节点大。
  • 内存占用。普通树占用的内存空间比它们存储的数据要多。你必须为节点对象以及左/右子节点指针分配内存。堆仅仅使用一个数据来存储数组,且不使用指针。
  • 平衡。二叉搜索树必须是“平衡”的情况下,其大部分操作的复杂度才能达到O(log n)。你可以按任意顺序位置插入/删除数据,或者使用 AVL 树或者红黑树,但是在堆中实际上不需要整棵树都是有序的。我们只需要满足堆属性即可,所以在堆中平衡不是问题。因为堆中数据的组织方式可以保证O(log n) 的性能。
  • 搜索。在二叉树中搜索会很快,但是在堆中搜索会很慢。在堆中搜索不是第一优先级,因为使用堆的目的是将最大(或者最小)的节点放在最前面,从而快速的进行相关插入、删除操作。

用数组构建堆

  • 规律(N为当前节点的索引)
    • 头节点: $\frac {N-1}{2}$
    • 节点高度为: $\log_2 N$
    • 左子节点和右子节点: 2N+1 2N+2
  • 如果最下面的一层已经填满,那么那一层包含 2^h 个节点。树中这一层以上所有的节点数目为 2^h - 1

优先队列(堆)
https://x-leonidas.github.io/2022/02/01/02数据结构及算法/优先队列(堆)/
作者
听风
发布于
2022年2月1日
更新于
2022年5月5日
许可协议