返回

最大堆/最小堆:概念、特性与算法

见解分享

最大堆/最小堆的概念

最大堆/最小堆是一种特殊的二叉树结构,它满足以下性质:

  • 每个节点的值都大于或等于其子节点的值(对于最大堆)或小于或等于其子节点的值(对于最小堆)。
  • 树是完全二叉树,即除了最底层之外,其他层的所有节点都有两个子节点。

最大堆和最小堆的示意图如下:

最大堆:
        10
      /   \
     8     6
    / \   / \
   4   2 1   3

最小堆:
        1
      /   \
     2     3
    / \   / \
   4   5 6   7

最大堆/最小堆的特性

最大堆/最小堆具有以下特性:

  • 最大堆的堆顶元素是堆中最大的元素。
  • 最小堆的堆顶元素是堆中最小的元素。
  • 在最大堆中,任何节点的值都大于或等于其子节点的值。
  • 在最小堆中,任何节点的值都小于或等于其子节点的值。
  • 最大堆和最小堆都是完全二叉树。

最大堆/最小堆的基本算法

最大堆/最小堆的基本算法包括:

  • 插入:在堆中插入一个新节点。
  • 删除堆顶:从堆中删除堆顶节点。
  • 调整堆:在堆中调整节点的位置,以满足堆的性质。

插入算法

在最大堆中插入一个新节点的算法如下:

  1. 将新节点插入到堆的最后一个节点的位置。
  2. 将新节点与其父节点进行比较,如果新节点的值大于父节点的值,则交换新节点和父节点的位置。
  3. 重复步骤2,直到新节点的值小于或等于其父节点的值。

在最小堆中插入一个新节点的算法与最大堆类似,只是比较的方式相反,即新节点的值小于父节点的值时交换新节点和父节点的位置。

删除堆顶算法

从最大堆中删除堆顶节点的算法如下:

  1. 将堆顶节点与堆的最后一个节点交换位置。
  2. 将堆的最后一个节点删除。
  3. 将新的堆顶节点与其子节点进行比较,如果新的堆顶节点的值小于其子节点的值,则交换新的堆顶节点和较大的子节点的位置。
  4. 重复步骤3,直到新的堆顶节点的值大于或等于其子节点的值。

从最小堆中删除堆顶节点的算法与最大堆类似,只是比较的方式相反,即新的堆顶节点的值大于其子节点的值时交换新的堆顶节点和较小的子节点的位置。

调整堆算法

调整堆的算法如下:

  1. 从堆的根节点开始,将其与左右子节点进行比较,如果存在子节点的值大于或等于根节点的值(对于最大堆)或小于或等于根节点的值(对于最小堆),则交换根节点和较大的(对于最大堆)或较小的(对于最小堆)子节点的位置。
  2. 重复步骤1,直到根节点的值大于或等于其左右子节点的值(对于最大堆)或小于或等于其左右子节点的值(对于最小堆)。

最大堆/最小堆的时间复杂度

最大堆/最小堆的基本算法的时间复杂度如下:

  • 插入:O(log n)
  • 删除堆顶:O(log n)
  • 调整堆:O(log n)

其中,n是堆中的节点数。

结语

最大堆/最小堆是一种非常重要的数据结构,在计算机科学中有着广泛的应用。本文介绍了最大堆/最小堆的概念、特性和基本算法,希望对您有所帮助。