数据结构-二叉树-堆(二)

一、建堆的时间复杂度问题

1、除了向上调整建堆,我们还可以向下调整建堆。不能在根上直接开始向下调整。这里的条件就是左右子树必须都是大堆或者小堆。我们可以倒着往前走,可以从最后一个叶子开始调整。但是从叶子开始调整没有意义。所以我们可以从倒数的第一个的非叶子开始调整。也就是最后一个叶子的父亲节点开始向下调整建堆。一层一层向上进行向下调整建堆,把大的数字往上调小的数字往下沉。那么问题来了怎么找到最后一个叶子的父亲节点。

我们先可以求出最后一个孩子的下标然后应用公式 parent = (child-1)/ 2 算出最后一个孩子的父亲节点的下标。

void HeapSort(int* a,int n)
{//首先建立大堆/*for (int i = 1; i < n; i++){UpAdjust(a, i);}*///向下调整建堆的效率要比向上调整建堆的效率要高for (int i = (n - 1 - 1) / 2; i >= 0; i--){DownAdjust(a, i, n);}//交换堆头和堆尾的数字选出最大的数字放到堆尾//然后向下调整int end = n - 1;while (end > 0){Swap(&a[end], &a[0]);DownAdjust(a, 0, end);end--;}
}

2、向下调整和向上调整建堆的时间复杂度

向下调整:倒数第二层有2^(h-2) 个节点

建堆的调整的次数

错位相减法算出时间复杂度

每层节点个数 × 这一层最坏向下调整多少次

最后的结果为:

所以时间复杂度为O(N)  T(N) = N - h。

向上调整:

再次使用上面的错位相减法

所以时间复杂度为O(NlogN)。

因为向下调整的过程中节点多的调整的次数少,节点少的调整的次数多。向上调整的过程中节点少的调整的次数少,节点多的调整的次数多

排序调堆的时间复杂度也是O(NlogN)。

TOPK 问题

1、建N个数的大堆,再Pop k次就可以了。

2、加入N很大呢?N是100亿呢? K == 50

      1G大约十亿字节。所以是40G左右

内存中存不下,数据是在磁盘文件中。

我们可以用100亿个数中的K个数建立一个小堆。遍历剩下的数据,如果这个数据比堆顶的数据大,就替代它进堆(向下调整)最后这个小堆的数据就是最大的前K个。

void HeapTopK(int* a, int n, int k)
{//首先向下调整建堆int* topk = (int*)malloc(sizeof(int) * k);//从a数组里读for (int i = 0; i < k; i++){topk[i] = a[i];}//建立小堆for (int i = (k - 1 - 1) / 2; i >= 0; i--){DownAdjust(topk, i, k);}//遍历剩下的数如果大于堆顶的数据我们就让它进堆并向下调整for (int i = k + 1; i < n; i++){if (a[i]  > topk[0]){topk[0] = a[i];DownAdjust(topk, 0, k);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【华为OD机试】5G网络建设【C卷|200分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N, 接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通,不同基站之间假设光纤的成本各不相同,且有…

mysql的多表查询和子查询

多表查询&#xff1a;查询数据时&#xff0c;需要使用多张表来查询 多表查询分类&#xff1a; 1.内连接查询 2.外连接查询 3.子查询 笛卡尔积&#xff1a; create table class (id int primary key auto_increment,name varchar(10) ); create table student (id int primar…

serdes 同轴电缆和双绞线接法

1、同轴电缆 Coaxial Cable 2、双绞线STP&#xff08;Shielded Twisted Pair&#xff09; 比如我们用的车载camera一般就只需要接一路即可&#xff0c;RIN接camera&#xff0c; RIN-通过电容接地。

python基础——正则表达式

&#x1f4dd;前言&#xff1a; 这篇文章主要想讲解一下python中的正则表达式&#xff1a; 1&#xff0c;什么是正则表达式 2&#xff0c;re模块三匹配 3&#xff0c;元字符匹配 4&#xff0c;具体示例 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&am…

qt中的取整函数

在Qt中&#xff0c;有以下几种常用的取整函数&#xff0c;用于处理浮点数的取整操作&#xff1a; 1. **qCeil()** - 向上取整&#xff1a; 该函数返回大于或等于给定浮点数的最小整数。如果输入值是正数&#xff0c;它会将小数部分去掉并增加到下一个整数&#xff1b;如果是…

重新理解React-hook

Hook是什么 Hook是React16.8版本新增的特性,它可以让我们在不写类组件的情况下使用state以及其他的React特性。 它解决了以下这些问题: 逻辑复杂的组件难以开发和维护,当我们的组件需要处理多个互不相关的local state时,每个生命周期函数中可能包含着各种互相关的逻辑类组…

认识HTTP

HTTP缺点 通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听 不验证通信方的身份&#xff0c;可能遭遇伪装 无法证明报文的完整性&#xff0c;所以有可能遭篡改 一、通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听 TCP/…

Git--基础学习--面向企业--持续更新

一、基础学习 1.1基本命令 //查询基础信息 git config --global --list //选取合适位置创建 mkdir 文件名 //创建文件夹 //全局配置 git config --global user.email "****e***i" git config --global user.name "*** K****"//--------------------进入…

西瓜书学习——线性判别分析

文章目录 定义LDA的具体步骤1. 计算类内散布矩阵&#xff08;Within-Class Scatter Matrix&#xff09;2. 计算类间散布矩阵&#xff08;Between-Class Scatter Matrix&#xff09;3. 求解最佳投影向量4. 数据投影5. 分类 定义 线性判别分析&#xff08;Linear Discriminant A…

函数指针 和 指针函数

1、函数指针 函数指针是指向函数的指针变量。它可以用于存储函数的地址&#xff0c;允许在运行时动态选择要调用的函数。&#xff08;是一个指针&#xff09; //函数指针的形式 返回类型 (*指针变量名) 参数列表int add(int a,int b){return ab; }int subtract(int a,int b){…

mysql相关基础操作

安装 [rootlocalhost ~]# yum install mariadb-server mariadb -y # 自动监听3306端口 [rootlocalhost ~]# systemctl start mariadb.service [rootlocalhost ~]# systemctl enable mariadb.service [rootlocalhost ~]# netstat -lntup安全初始化 修改root用户的密码,新版本可…

php动态高亮web源代码

php动态高亮web源代码 注&#xff1a;配置好不允许高亮的文件名&#xff0c;安全第一 #php实现动态展示目录树结构源代码 适用于开放源代码&#xff0c;结合html缓存使用效果更佳&#xff0c;因循环较多不适合放首页 能力有限没实现行号 演示&#xff1a;show source|开放…

【Pytorch】NameError: name ‘Variable‘ is not defined

报错 NameError Traceback (most recent call last) Cell In[20], line 42 for epoch in range(num_epochs):3 if torch.cuda.is_available(): ----> 4 inputs Variable(x_train).cuda()5 target Variable(y_train).…

AWS云服务器选择哪个区域最好?

AWS每个区域都有特点&#xff0c;并无谁好谁坏的说法。云服务器最佳区域的选择取决于多个因素&#xff0c;包括业务需求、用户位置、数据合规性、延迟需求以及成本等。接下来是AWS的合作伙伴九河云提供的一些考虑因素和建议&#xff1a; &#xff08;1&#xff09;业务需求&am…

多家企业机密数据遭Lockbit3.0窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件87起&#xff0c;与上周相比勒索事件大幅下降。美国依旧为受勒索攻击最严重的国家&#xff0c;占比45%。 本周Cactus是影响最严重的勒索家族&#xff0c;Lockbit3.0和Bianlian恶意家族紧随其后&#xff0c;从整体上看Lockbit3.0依旧…

git 命令怎么回退到指定的某个提交 commit hash 并推送远程分支?

问题 如下图&#xff0c;我要回退到 【002】Babel 的编译流程 这一次提交 解决 1、先执行下面命令&#xff0c;输出日志&#xff0c;主要就是拿到提交 commit 的 hash&#xff0c;上图红框即可 git log或者 vscode 里面直接右击&#xff0c;copy sha 2、执行下面命令回退 g…

05_Scala运算符

文章目录 **1.Scala运算符****2.scala中没有 --等语法****3.逻辑运算符和Java完全相同****4.scala认为万物皆对象** 1.Scala运算符 Scala底层 使用的是equals() 程序员比较两个量的时候&#xff0c;谁来没事比较内存地址&#xff1f; Java中引用数据类型比较地址&#xff0…

XiaodiSec day011 Learn Note 小迪安全学习笔记

XiaodiSec day011 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day11 工具: fofa quake kunyu suize水泽 ari灯塔 of 信息收集 四大引擎 fofaquakeshodanzoomeye fofa 和 quake比较常用 使用引擎搜索信息 得到中间件和操作系统 能够筛选端口 目的是…

黑马点评(十二) -- UV统计

一 . UV统计-HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。 PV&#xff1a;全称Page View&…

Games101-动画与模拟(基本概念、质点弹簧系统、运动学)

动画&#xff1a;把物体变成活的&#xff0c;让它动起来 更关注的是美学。早期的动画是画出来的&#xff0c;并不关心对不对&#xff0c;符不符合物理&#xff0c;只要看起来对 图形学里对动画理解为对于建模或几何的拓展。动画无非就是在不同的时间或不同的帧有不同的几何形状…