首页 > 其他分享 >[数据结构]堆

[数据结构]堆

时间:2024-07-07 15:43:35浏览次数:19  
标签:+...+ log2 向上 向下 数据结构 节点 调整

建堆的两种方式

自上而下

这种方式的思路是,每插入一个节点,就向上比较,判断是否需要与其父节点进行交换,

image

分析这种方式的时间复杂度,假设树的高度为h,以下均考虑最坏情况,也就是每一个节点都调整到根

第一层的1个节点不需要调整

第二层的2个节点,每个节点向上调整1次,2*1,

第三层的4个节点,每个节点向上调整2次,4*2,

第四层的8个节点,每个节点向上调整3次,8*3,

...

第h层的2^(h-1)个节点,每个节点向上调整h-1次,2^(h-1)*(h-1)

累计,

T(n) = 2^(1)*1+2^(2)*2+2^(3)*3+2^(4)*4+...+2^(h-1)*(h-1)

2*T(n) = 2^(2)*1+2^(3)*2+2^(4)*3+2^(5)*4+...+2^(h-1)*(h-2) +2^(h)*(h-1)

用T(n)-2*T(n),

T(n)-2*T(n) = 2^1+2^2+2^3+...+2^(h-1)-2^(h)*(h-1)

​ = 2^h-2-2^h*(h-1)

h=log2(n)代入

​ = 2^(log2(n))-2-2^(log2(n))*(log2(n)-1)

​ = n-2-n*(log2(n)-1)

保留最高项

T(n) = O(nlog2(n))

自下而上

先建立完全二叉树,然后从最后一个有叶子结点的节点开始向前调整。

image

时间复杂度分析,假设树的高度为h,

第一层有1个节点,向下调整h-1次,1*(h-1)

第二层有2个节点,向下调整h-2次,2*(h-2)

第三层有4个节点,向下调整h-3次,4*(h-3)

第四层有8个节点,向下调整h-4次,8*(h-4)

...

h-1层有2^(h-2)个节点,向下调整1次,

h层有2^(h-1)个节点,向下调整0次,

T(n) = 2^0*(h-1)+2^1*(h-2)+2^2*(h-3)+2^3*(h-4)+...+2^(h-2)*1

2*T(n) = 2^1*(h-1)+2^2*(h-2)+2^3*(h-3)+2^4*(h-4)+...+2^(h-2)*2+2^(h-1)*1


2*T(n)-T(n) = -(h-1) + 2+2^2+2^3+2^4+...+2^(h-2)+2^(h-1)

​ = -(h-1)+2^h-2

带入h = log2(n)

T(n) = -(log2(n)-1)+n-2

保留最高项

T(n) = O(n)

标签:+...+,log2,向上,向下,数据结构,节点,调整
From: https://www.cnblogs.com/DCFV/p/18288544

相关文章

  • 【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统
    不同类型的链表​专栏内容:postgresql使用入门基础手写数据库toadb并发编程个人主页:我的主页管理社区:开源数据库座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.文章目录不同类型的链表概述1.数据类型识别1.1TLV格式介绍1.2结构体分层定义1.3定义......
  • 数据结构——RMQ(ST表)问题
    数据结构——RMQ(ST表)问题问题描述对于序列\(A[1\dotsn]\),有\(m\)组询问\(\langlel,r\rangle\),求\(\max_{i=l}^rA_i\)。我们下面使用\(\mathcalO(A)\sim\mathcalO(B)\)表示预处理\(\mathcalO(A)\),单次询问\(\mathcalO(B)\)的时间复杂度。线段树解法时间复杂度......
  • 数据结构初阶 遍历二叉树问题(一)
    一.链式二叉树的实现1.结构体代码typedefintBTDateType;typedefstructBinaryTreeNode{ BTDateTypedata; structBinaryTreeNode*left; structBinaryTreeNode*right;}BTNode;大概的图形是这样子2.增删查改我们这里要明确的一点的二叉树的增删查改是没有......
  • DAY 1 数据结构与算法 (选择排序,冒泡排序,插入排序)
    1.选择排序        选择排序(SelectionSort)是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选择最小(或最大)的一个元素,放在已排好序的元素序列的末尾,直到全部待排序的数据元素排好序为止。即每一次设定一个数为最大或者最小值,然后与其他的数进行交......
  • 数据结构——二叉树相关题目
    1.寻找二叉树中数值为x的节点//寻找二叉树中数值为x的节点BTNode*TreeFind(BTNode*root,BTDataTypex)//传过来二叉树的地址和根的地址,以及需要查找的数据{ if(root==Null) { returnNull; }//首先需要先判断这个树是否为空,如果为空直接返回空 if(root->data=......
  • [数据结构] 基于交换的排序 冒泡排序&&快速排序
    标题:[数据结构]基于交换的排序冒泡排序&&快速排序@水墨不写bug(图片来源于网络) 目录(一)冒泡排序优化后实现:(二)快速排序I、实现方法: (1)hoare法hoare法实现快排: (2)挖坑法挖坑法实现:(3)双指针法 双指针法实现:  II、快速排序复杂度分析:比较完备的快速排序实现如......
  • 数据结构题目:模式匹配的BF算法
    1、实验目的键盘输入目标串(主串)s、模式串(子串)t,编写程序,实现顺序串的BF模式匹配算法。2、实验具体要求匹配成功,输出位序,匹配不成功,显示相应提示信息。例如:s=“aababcdcccc”,t=“bcd”。3、实验设计思路(编程语言、模块划分及函数功能描述等)模块划分及函数功能描述:(1)主程序......
  • 数据结构——(双)链表
    文章目录1. 定义2. 双链表和单链表的区别3.代码示例3.1双链表节点和结构定义3.2初始化双链表3.3 返回双链表的长度3.4 在指定位置插入元素3.5 在末尾插入元素3.6 删除指定位置的元素并返回被删除的元素3.7 删除末尾元素3.8获取指定位置的元素3.9修改指......
  • 数据结构——单向循环链表
    文章目录1.概念2. 区别2.1结构区别2.2访问方式区别2.3优缺点对比3.流程4. 基本操作5.代码示例1.概念单向循环链表是一种特殊的单链表,其中最后一个节点的后继指针指向头节点,形成一个环。单向循环链表适合用于需要循环访问数据的场景,如约瑟夫环问题。节点......
  • 数据结构小学期第六天
    今天完全实现了九宫格拼图游戏,具备一键通关功能按下W键,查看原图功能按住A键不松,移动图片按上下左右键,如果你自己想要实现这个功能,需要自己的图片,图片格式要求。每个小图片是105*105,完整图片是315*315.有人想要做一下,可以试一试。代码如下启动类1importcom.itheima.ui.GameJ......