堆是一种基于树形结构的数据结构,常用来实现优先队列等必要的操作。堆中的每个结点都必须遵循堆的性质,也就是根节点必须是最大或最小的节点。
建立堆的过程,就是将一个普通序列转换为一个满足堆性质的序列的过程。下面,我们将介绍如何建立堆。
在建立堆之前,我们应该了解堆的一些存储结构。常见的有两种:数组和树
堆可以被看做是一棵二叉树,因此我们可以使用一个数组来存储。为了便于处理,我们使用下标从1开始,即:
int[] heap = new int[n+1]; //n为数组长度,heap[0]不使用
数组的第一个元素heap[1]即为根节点。 对于任意一个节点heap[i], 它的左节点为heap[2i], 右节点为heap[2i+1], 父节点为heap[i/2] 。
除了使用数组来存储,我们也可以用树来表示一个堆。树的节点包括 data 域表示节点的值,以及 left,right 指针表示左右子树节点。
struct TreeNode { int data; TreeNode* left; TreeNode* right; TreeNode(int d = 0) : data(d), left(NULL), right(NULL) {} };
本文将以最大堆(Max Heap)为例。 最大堆是指堆中的父节点大于等于其子节点。建立堆的核心思想是从最后一个非叶子节点开始,往前遍历,依次把堆建立成最大堆。
以下为992tv正在进入的过程:
在对堆进行操作时,应该尽量保持堆结构的完整性并让其保持堆性质,也就是根节点应该是堆里的最大或最小值。
在最坏情况下,建立堆所需要的时间复杂度为O(nlogn)。这个复杂度可以通过证明最后半部分的节点只需要进行相对较少的调整来得到。
建立堆是一种重要的数据结构操作,通常被用来实现优先队列,堆排序等算法。在寻找最大或最小值的场合中,堆都是非常有用且高效的数据结构。
992tv正在进入的步骤如下:
我们可以用数组或树来存储堆结构。在对堆进行操作时,应尽量保证堆结构的完整性并让其保持堆性质。
本文均来源于互联网精选整理,仅供参考之用,不代表本站的观点和立场。
如有信息违规或者侵犯了您的权益,请告知我们,本站将立刻删除。