二叉树相关(下)

堆树

堆是一种特殊类型的二叉树,具有以下两个性质:

  1. 每个节点的值大于(或小于)等于其每个子节点的值。
  2. 该树完全平衡,最后一层的叶子都处于最左侧位置。

违反以上两个性质之一的树都是非堆树。当父节点的值总是大于或小于其子节点的时候,则称为最大堆和最小堆。

图示最大堆:
最大堆
可以用数组来实现堆,根据最大堆的性质:
heap[i] ≥ heap[2i+1]
heap[i] ≥ heap[2i+2] ,注意2i+2不能超过项数。
根据堆树的性质,其是一个完全二叉树,所以i可以视为父节点,而2i+1和2i+2视为其左右子节点,对于最大堆来说,上面两个公式始终成立,因此可以将一个无序数组转变为堆树。

将堆作为优先队列

之前的文章栈和队列当中描述了用链表实现优先队列的方式,其结构复杂度是 O ( n ) O(n) O(n) O ( n ) O(\sqrt n) O(n ),对于n较大的时候,效率极其低下,而堆是完全平衡树, O ( log ⁡ n ) O(\log n) O(logn)次查找可以到达叶节点。为了达到这个目的,可以向堆中添加或删除元素。为了保持堆的性质,在添加元素的时候可以将最后一个叶子节点向根部移动。
在堆中添加元素
上述算法的中心思想是在堆尾添加新的元素,并一直往根节点移动直至父节点比该节点的值大,此时堆树的结构未被打破。
在堆中删除元素
由于堆的性质,删除的一定是根节点(FIFO)并且将原来的尾节点逐步下移直至满足一个新的堆。

用数组实现堆

堆可以用数组实现,但数组并不是堆。某些情况下,数组需要转变为堆(堆排序)。进行堆转化有多种方式,最简单的就是从空堆,按顺序添加心得元素,这是一个自顶向下的方法。
通过对之前描述的堆插入的描述,我们可以总结出这种算法的最坏情况得出复杂度。当每个新添加的元素都需要从堆尾移动到堆顶,这种情况需要的步骤最多,第k个节点,移动到堆顶需要 ⌊ lg ⁡ k ⌋ \lfloor \lg k \rfloor lgk次交换操作,所以总的计算公式为:
∑ i = 1 n ⌊ lg ⁡ k ⌋ ≤ ∑ i = 1 n lg ⁡ k = lg ⁡ 1 + lg ⁡ 2 + . . . + lg ⁡ n = l g ( 1 ∗ 2 ∗ . . . ∗ n ) = lg ⁡ ( n ! ) = O ( n lg ⁡ n ) {\displaystyle\sum_{i=1}^n }\lfloor \lg k \rfloor \le \displaystyle{\sum_{i=1}^n \lg k}=\lg1+\lg2+...+\lg n=lg(1*2*...*n)=\lg (n!)=O(n\lg n) i=1nlgki=1nlgk=lg1+lg2+...+lgn=lg(12...n)=lg(n!)=O(nlgn)
该式的证明过程略,百度可以搜到。

而常用另一种堆排序算法分为堆创建和堆重构两个部分,简单说明,堆创建的时间复杂度为O(n),堆重构的复杂度为O(nlgn)。

treap树

堆的性质非常有趣,它是完全平衡树,且允许立即访问最大或者最小节点,无法立即访问其他元素。二叉树的查找非常高效,但取决于插入与删除操作的顺序以及树的形状,畸形树会趋近于链表的复杂度。这里我们将堆与查找树的概念结合,形成treap树,这种结构抛弃了树完全平衡的要求,以及叶子节点应该在靠左位置的特征,尽管堆本身会尽可能平衡。

  • 36
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值