当前位置: 首页 > news >正文

二叉树与堆相关的时间复杂度问题

目录

满二叉树与完全二叉树高度h和树中节点个数N的关系

向上调整算法:

介绍:

复杂度推导:

向下调整算法:

介绍:

复杂度推导:

向上调整建堆:

介绍:

复杂度推导:

向下调整建堆:

介绍:

复杂度推导:


满二叉树与完全二叉树高度h和树中节点个数N的关系

向上调整算法:

介绍:

函数功能:将堆通过向上调整算法使堆成为小堆(父亲<孩子)或大堆(父亲>孩子),堆内父亲=(孩子-1)/2。只要孩子还在堆范围内,就不断判断孩子与父亲的关系。若想设置小堆,则孩子<父亲就执行交换;若想设置大堆,则孩子>父亲就执行交换。

函数参数:HeapDataType * a—>堆内数据类型首元素的指针  int child—>堆底元素(孩子)

函数返回值:

void AdjustUp(HeapDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

复杂度推导:

一次向上调整最多调整高度次数,根据满二叉树h=log(N+1),完全二叉树h=log(N)+1,而时间复杂度计算的是最大情况的数量级,所以一次向上调整的复杂度为O(logN)


向下调整算法:

介绍:

函数功能:将堆通过向下调整算法使堆成为小堆(父亲<孩子)或大堆(父亲>孩子),使用假设法先假定要交换的元素为左孩子,child=parent*2+1,若右孩子>左孩子,则需交换的元素为parent*2+1+1。只要孩子还在堆范围内,就不断判断孩子与父亲的关系。若想设置小堆,则孩子<父亲就执行交换;若想设置大堆,则孩子>父亲就执行交换。

函数参数:HeapDataType * a—>堆内数据类型首元素的指针  int n —>堆内元素个数          int parent—>堆顶元素(父亲)

函数返回值:

void Adjustdown(HeapDataType* a, int n, int parent)
{size_t child = parent * 2 + 1;while (child < n){if (child + 1 < n && a[child + 1] < a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

复杂度推导:

一次向下调整最多调整高度次数,根据满二叉树h=log(N+1),完全二叉树h=log(N)+1,而时间复杂度计算的是最大情况的数量级,所以一次向下调整的复杂度为O(logN)


向上调整建堆:

介绍:

前提:上几层都是堆

先将数组内所有元素插入堆结构内,再从第一个元素到最后一个元素进行遍历,对每个元素使用向上调整算法,使堆结构成为大堆/小堆

复杂度推导:


向下调整建堆:

介绍:

前提:左右子树都是堆

先将数组内所有元素插入堆结构内,再从最后一个父亲的位置到第一个父亲的位置进行遍历,对每个元素使用向下调整算法,使堆结构成为大堆/小堆

复杂度推导:

http://www.lryc.cn/news/391205.html

相关文章:

  • goLang小案例-获取从控制台输入的信息
  • 1-5题查询 - 高频 SQL 50 题基础版
  • Modbus协议转Profinet协议网关模块连智能仪表与PLC通讯
  • 新手必学:TikTok视频标签的使用方法
  • AI是在帮助开发者还是取代他们
  • 【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化
  • 使用c++函数式编程实现Qt信号槽机制
  • 【Android】Activity子类之间的区别
  • 在 Mac 上使用 MLX 微调微软 phi3 模型
  • 【JavaEE】多线程代码案例(2)
  • Halcon支持向量机
  • 【Python机器学习】模型评估与改进——在模型选择中使用评估指标
  • 【C语言】union 关键字
  • 电脑回收站删除的文件怎么恢复?5个恢复方法详解汇总!
  • mac 安装cnpm 淘宝镜像记录
  • ArcGIS Pro SDK (七)编辑 11 撤销重做
  • Excel 中的元素定位:相对定位、绝对定位和混合定位
  • Idea2024安装后点击无响应
  • 如何提高实验室分析结果的准确性呢
  • Perl 格式化输出:提升代码可读性的技巧
  • JavaScript基础-函数(完整版)
  • AI开发者的新选择:Mojo编程语言
  • 软考(高项)系统分析师--论软件开发模型及应用
  • 同一天提档又撤档!电影《野孩子》宣布取消7月10日公映安排——浔川电影报
  • Shell编程之免交互
  • 基于opencv的斜光测距及python实现
  • 梯度下降算法
  • 第5章:软件工程
  • cefsharp在splitContainer.Panel2中显示调试工具DevTools(非弹出式)含源代码
  • nginx部署多个项目;vue打包项目部署设置子路径访问;一个根域名(端口)配置多个子项目