1、堆及性质
堆,或者叫二叉堆,可以被视为一棵完全二叉树。树中每个节点与数组中存放该节点值的那个元素相对应。树的每一层都是填满的,除了最后一层。节点在堆中的高度定义为从本节点到叶子节点的最长简单下降路径上边的数目,而堆的高度就是树根的高度。因此,在高度为h的堆中,共有h+1层,最多有2^(h+1)-1个元素,最少有2^h个元素。而n个元素的堆的高度为log2n最小值。
2、分类
二叉堆分为两种:最大堆和最小堆(小根堆)。最大堆(最小堆)指每个节点的值都比其两个子节点的值要大或等于(小或者等于)。
最大堆用于堆排序中,最小堆通常用于构造优先队列时用。
3、建堆子程序
首先,介绍最大堆操作的一个重要子程序Max_Heapify(A,i),输入是一个数组A和下标i,此程序将以i为根的子树成为最大堆,但前提是i为根的两个子树都已经是最大堆。其将A[i]在最大堆中下降,知道找到合适的位置满足以i为根的子树成为最大堆。
程序如下:void max_heapify(int A[],int len,int i){
int l=2*(i+1)-1;//左孩子下标
int r=2*(i+1);//右孩子下标
int largest=i;//初始化时,将largest设为i,否则到达叶子时由于初始不等于i会出现死循环一直递归
int temp=0;
if(l<len&&A[l]>A[i]){//1
largest=l;
}
if(r<len&&A[r]>A[largest]){//2,这两处小于号是求最小堆,大于号是最大堆
largest=r;
}
if(i!=largest){
temp=A[i];
A[i]=A[largest];
A[largest]=temp;
max_heapify(A,len,largest);
}
}
程序是个递归的过程,首先找到节点i和两个子节点这三个节点中值最大的下标存入largest,如果最大的就是A[i],以i为根的子树已经是最大堆,程序结束。否则,将A[largest]和A[i]互换,交换后,下标为largest的节点的值是A[i],此时再往下降,调用此时的以largest为根节点的递归程序。
Max_Heapify用于一个高度为h的节点所需的运行时间为O(h).
4、建堆
自底向上的用Max_Heapify来将数组A[0,...,n-1]变成最大堆,由于A[n/2+1,....,n-1]都是叶子节点,没有子节点,因此不需要执行。所以只需从n/2自底向上到0,调用Max_Heapify。
为什么自底向上?因为Max_Heapify的前提是左右两个子树必须是最大堆,因此,自底向上,保证这个前提条件。下面是建堆程序:
int main(){
int A[10]={16,4,10,14,7,9,3,2,8,1};
int len=10;
for(int i=len/2;i>=0;i--){//建最大堆或者最小堆
max_heapify(A,len,i);//min_heapify(A,len,i)
}
return 0;
}
分析建堆算法,Max_Heapify运行时间O(log2n),共有O(n)次调用,故运行时间O(nlog2n)。更精确的,根据二叉树的性质,在任意高度h上,至多有n/2^(h+1)(取最大值)个节点。一个n元素堆的高度为log2n,因此,可算得运行时间为
O(n),即在线性时间里,可以完成最大堆(最小堆)的建立。
分享到:
相关推荐
数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行各种操作。湖南大学的数据结构期末试题涵盖了这门课程的重要概念和技术,旨在检验学生对这些知识的理解和应用能力。以下...
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便于执行各种操作。在数据结构中,树是一种非线性的数据结构,它模拟了自然界中树的概念,具有分层和父子关系的特点。在本压缩包中,我们...
在“数据结构-huffman”这个项目中,你可能会学习到如何使用编程语言实现上述步骤,例如使用Python的heapq库来构建最小堆。同时,你还会涉及到如何读取和写入哈夫曼编码文件,以及如何对原始文本进行编码和解码。 ...
第三部分,DSB_1_-_.ppt,涵盖了图数据结构。图是由节点(顶点)和连接节点的边组成,可以表示各种复杂关系。图的遍历策略包括深度优先搜索(DFS)和广度优先搜索(BFS),这些方法广泛应用于网络路由和社交网络分析...
相关链接 二叉树的基础知识点:数据结构-----树和二叉树的定义与性质_Gretel Tade的博客-CSDN博客堆的相关方法代码实现:数据结构-----堆(完全二叉树)_Gretel Tade的博客-CSDN博客二叉树的链式存储结构 #include...
树形结构是数据结构中的重要组成部分,包括二叉树、平衡树和堆。二叉树每个节点最多有两个子节点,可以用于实现查找和排序。平衡树,如AVL树和红黑树,确保了搜索效率的最优化。堆是一种特殊的树形结构,常用于优先...
如题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
1. **数组**:数组是最基础的数据结构,它提供了一种在内存中连续存储相同类型元素的方法。数组通过下标访问元素,具有快速访问的特点,但插入和删除操作相对较慢。 2. **链表**:链表是由一系列节点组成的数据结构...
在实际应用方面,佟维教授可能会讲解数据结构在排序算法(如快速排序、归并排序、堆排序等)和查找算法(如二分查找、哈希查找)中的应用。这些算法与数据结构的结合,可以极大地提高程序的运行效率。 此外,课程...
比较详细地讲述了堆排序的思路和代码实现,适合初学者
数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和操作数据。在山东大学软件学院2018-2019的数据结构考试中,涉及了线性结构、层次结构和网状结构这三个关键概念。 **线性结构**: 1. 线性表...
数据结构-java实现一个简单的最小堆结构SimpleHeap,展示了如何使用数组来实现最小堆,实现了最小堆的基本操作:插入和删除。insert 方法将元素添加到堆中,并调用 siftUp 方法来维护堆的性质。remove 方法删除堆顶...
- **堆排序**:利用堆这种数据结构所设计的一种排序算法,分为建堆和调整两个阶段。 - **归并排序**:同样基于分治法思想,将数组分成两半,递归地对每一半进行排序,然后合并结果。 ### 综合分析比较 本书不仅介绍...
二叉堆是一种自平衡的数据结构,可以确保在O(log n)的时间内完成操作,对于大数据集尤其有效。 4. **并查集(Disjoint Set)实现**: 并查集用于处理集合的合并与查询问题。在这个问题中,我们可以将每个成员视为...
哈希表是一种通过哈希函数将关键字映射到数组索引的数据结构,提供了平均时间复杂度为O(1)的查找、插入和删除操作。哈希表的关键在于设计一个好的哈希函数,以减少冲突的发生。 ### 应用举例 书中通过具体的例子...
《数据结构》严蔚敏版 堆排序
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便于执行各种操作。在本章中,我们将探讨用C语言实现的数据结构,特别是几种不同的排序算法。 首先,排序是数据处理中常见且重要的任务,...
二叉树是计算机科学中数据结构的一个重要概念,它在许多算法和问题解决中发挥着核心作用。在数据结构的世界里,二叉树是一种特殊的树形结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构...
二叉树是计算机科学中一种重要的数据结构,它在很多算法和问题解决中扮演着核心角色。本资料主要探讨了二叉树的基本概念、实现方式以及遍历方法。 首先,我们要理解二叉树的基本定义。二叉树是由节点(或称为顶点)...