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

树与二叉树堆:堆的意义

目录

 堆的意义: 

第一是堆的排序,第二是堆的top k 排行问题

堆的 top k 排行问题:

面对大量数据的top k 问题:

 堆排序的实现:——以升序为例

方法一  交换首尾: 

建立大堆:

根结点尾结点的交换配合自上而下的操作:

自上而下的函数 :

自下而上的函数:

源文件: 

主函数部分:

方法二  反复横跳: 

实现: 

top K 排行问题:— 以处理较多数据为例,最大的前K个数

创建数据并存储到文件中: 

创建K个数的小堆: 

 进行交换:

打印堆: 

完整代码: 

自上而下调整的时间复杂度:

自下而上调整的时间复杂读: 

 


 堆的意义: 

第一是堆的排序,第二是堆的top k 排行问题

堆的 top k 排行问题:

  • 堆的top k 排行问题主要是利用了 大堆或者小堆的堆顶一定是最大或者最小值的特点,再利用了堆的删除操作,从而进行堆的一种大小排序,从而形成一种升序或者逆序的top榜单排满。

面对大量数据的top k 问题:

再面对大量的数据时,如果要进行排列前k个最小的数值时,可以先创建一个拥有K个结点大小的小堆,随后再进行插入,将插入的数据和栈顶元素进行比较,如果比栈顶元素小,那么替换栈顶元素,随后再和栈顶下的各个结点进行比较和交换。

这种做法到最后,形成了一种栈顶是最小的元素的结果,这种方法也相当于是一种末位淘汰制。 

 堆排序的实现:——以升序为例

  • 关于升序,一般大多数人会想到使用小堆,因为小堆的特点是父节点比子节点小,而堆的底层结构又是数组,所以大多数人最初想到的是使用小堆来实现堆排序问题。
  • 但这是错误的,因为堆其实是一种选择排序。

如果排升序建立小堆,我们可以一开始获取最小的数字,但是我们下一步呢,如果找第二小的数字?

如果要找第二个最小的数字,如果在当前这个堆的基础上找,那么关系全乱了,因为要在兄弟之间,要在父亲的兄弟之间,父亲的兄弟的孩子之间找

这时候只能重新建一个堆,但是建堆的代价是时间复杂度的重复性。

所以,使用大堆来解决堆排序的升序问题!

方法一  交换首尾: 

 根据,堆删除的一种思想,交换!

根结点元素和尾结点元素的交换,以大堆的父结点元素比子结点元素大的特点,最后一个结点的元素是堆的最小值,而根结点的元素是堆的最大值,当二者进行交换后,最小值跑到了根结点位置,最大值跑到了最尾部结点。

而此时,使用循环的方法再结合屏蔽尾部结点的方法,在轮流交换的过程下,很快就会形成一个以大堆的基础构建的小堆,而小堆在数组中的排序便是升序的! 

建立大堆:

使用之前构建堆的方法过于繁琐,所以可以利用现成数组和自下而上的交换方法进行大堆的建立 

根结点尾结点的交换配合自上而下的操作:

- -end是用来屏蔽每一会的最尾结点,end 是下标的意思,n是数组大小的意思。

 

自上而下的函数 :

自下而上的函数:

源文件: 

主函数部分:

方法二  反复横跳: 

反复横跳的核心是找到最后一个结点的父节点,进行自上而下的交换,利用升序和大堆的特点——父结点比子结点大,将父结点的元素和子结点的元素进行交换。

  • 且每一次交换后都会形成一颗子树,这时候在将这颗子树的下标跳到隔壁子树上,再度进行刚才的操作,这样一来,左右子树的父子结构均不会被破坏,且还会变成一个升序的小堆。

实现: 

i  表示为父结点的下标,n一开始是最尾部结点的下标。 


top K 排行问题:— 以处理较多数据为例,最大的前K个数

 在之前上文堆的意义中,详细讲过了堆的top k问题,而这里以处理较多数据的top k 为例

创建数据并存储到文件中: 

这一步主要是怕数据过多导致终端卡顿 

  •  代码解读:
  • srand 函数进行选取随机,然后在使用time传输随机值,然后以写("w")的方式打开文件
  • 然后因为要产生一千万个数值,而rand只能产生三万多个数字所以需要+i并%上10000000
  • 之后将这些数据写入文件中(fprintf),最后关闭文件,fin是文件的指针变量

file 是指向文件的指针,fin是文件内部进行内容操作的指针 

 

创建K个数的小堆: 

  •  根据小堆的特点,根部是堆中最小的数字,如果需要寻找最大的数,则可以通过堆顶的根结点元素进行第一道排查
  • 而比堆顶大的数则替换堆顶元素,随后根据小堆的特点,父结点比子结点小,从而进行自上而下的交换,把较大的元素丢到堆的尾部进行二次的排查。
  • 这样到最后,最后一个结点是最大的数,而堆顶的根结点元素则是这一千万个数种第K个最大的数。

  • 注意,这里还是使用了数组构建堆的方法,而进入数组中的元素由fscanf函数从之前创建好的文件中拿取。 
  • 使用了malloc建立了一个能够存放K个元素的字节 的 空间大小,作为数组。
  • fscanf是从指定标准流中获取内容,scanf是从键盘标准流中获取内容
  • fascnf 的三个参数分别是,一个文件类型的指针负责读取数据,一个读取后展示的格式,第三个是读数后读取的数据存放的空间
  • fscanf读完数据后会返回EOF

 进行交换:

因为fscanf读完数据后会返回EOF,所以 以此作为判定条件,x用来寄存从文件中读取的元素,当x比堆顶根结点元素大时,替换堆顶根结点元素,随后进行自上而下的交换进行调整堆的元素,以此维持小堆结构。 

打印堆: 

  • 最后将堆打印 

 

完整代码: 


自上而下调整的时间复杂度:

自下而上调整的时间复杂读: 


 

相关文章:

树与二叉树堆:堆的意义

目录 堆的意义: 第一是堆的排序,第二是堆的top k 排行问题 堆的 top k 排行问题: 面对大量数据的top k 问题: 堆排序的实现:——以升序为例 方法一 交换首尾: 建立大堆: 根结点尾结点的…...

什么时候适合做ui自动化测试?什么时候做接口自动化测试

UI自动化测试和接口自动化测试都是软件测试中非常重要的部分,它们各自有适合的应用场景。 适合做UI自动化测试的场景包括: 用户界面(UI)变化频繁的应用程序。需要测试用户交互和流程的应用程序。需要验证页面布局、样式和交互的…...

[ABC261E] Many Operations(dp,位运算,打表)

[ABC261E] Many Operations - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Problem Statement We have a variable X and N kinds of operations that change the value of X. Operation i is represented as a pair of integers (Ti​,Ai​), and is the following operati…...

一、爬虫-爬取豆瓣电影案例

1、环境配置 你需要一个pycharm和requests第三方库,在安装完成之后即可继续浏览。 2、操作流程 (1)打开豆瓣电影网站,点击排行榜,点击喜剧,检查 (2)可以看到鼠标每次下移&#xff0…...

4G5G防爆执法记录仪、防爆智能安全帽赋能智慧燃气,可视化巡检巡线,安全生产管控

随着燃气使用的普及,燃气安全问题日益突出。传统应急安全问题处理方式暴露出以下问题: 应急预案不完善:目前一些燃气企业的应急预案存在实用性不高、流程不清晰等问题,导致在紧急情况下难以迅速启动和有效执行。 部门协同不流畅…...

武汉数字孪生赋能工业制造,加速推进制造业数字化转型

随着数字孪生技术的不断推进,互联网、物联网、智能传感技术开始应用到数控机床的远程服务,状态监控,故障诊断,维护管理等方面。武汉数字孪生是在虚拟空间中创建物理对象的高保真虚拟模型,以模拟其在现实世界中的行为提…...

安卓密码框、EditText

目录 1. 基础使用 2. 密码的展示与隐藏 (1) 使用setTransformationMethod方法 (2) 使用setInputType方法 3. imeOptions属性 4. 单行设置 在安卓中使用密码框普遍采用EditText设置inputType"textPassword"的方式。 1. 基础使用 <EditTextandroid:id"…...

ROS命令行工具

1、roscore 在使用ROS之前&#xff0c;首先要启动roscore进程。当我们在终端中运行这个命令时&#xff0c;系统就会启动ROS Master、参数服务器和日志节点。在这之后&#xff0c;就可以运行任何其他的ROS程序&#xff0f;节点了。所以可以在一个终端窗口运行roscore指令&#…...

深入浅出 Golang 中的直接依赖和间接依赖管理

目录 引言 直接依赖 间接依赖 为什么需要间接依赖&#xff1f; 如何管理间接依赖&#xff1f; 小结 引言 Golang 中的依赖管理是使用 go mod 进行管理的。go mod 是 Golang 官方推出的依赖管理工具&#xff0c;可以帮助开发者管理项目的依赖关系&#xff0c;确保项目代码…...

深入Python元编程:了解声明与初始化定制元类

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 简介 在Python中&#xff0c;元编程是指在运行时创建或定制类的编程。元类是Python中最强大的元编程工具之一&#xff0c;允许您控制类的创建过程。元类是类的类&#xff0c;它控制类的实例化&#xff0c;允许您…...

[传智杯初赛] 期末考试成绩

传智专修学院的 Java 程序设计课程的评价体系是这样的&#xff1a; 首先&#xff0c;所有学生会有一个卷面得分&#xff0c;这个得分一定是一个 [0,100][0,100] 之间的整数。 如果卷面得分在 9090 分及以上&#xff0c;那么他的 GPA&#xff08;加权平均成绩&#xff09; 就是…...

Linux 常用基本命令

文章目录 7.1 帮助命令7.1.1 man 获得帮助信息7.1.2 help 获得shell内置命令的帮助信息7.1.3 常用快捷键 7.2 文件目录类7.2.1 pwd 显示当前工作目录的绝对路径7.2.2 ls 列出目录的内容7.2.3 cd 切换目录7.2.4 mkdir 创建一个新的目录7.2.5 rmdir 删除一个空的目录7.2.6 touch …...

阿里云语雀频繁崩溃,有什么文档管理工具是比较稳定的?

10月23 日14:00左右&#xff0c;蚂蚁集团旗下的在线文档编辑与协同工具语雀发生服务器故障&#xff0c;在线文档和官网都无法打开。直到当天晚上22:24&#xff0c;语雀服务才全部恢复正常。从故障发生到完全恢复正常&#xff0c;语雀整个宕机时间将近 8 小时&#xff0c;如此长…...

二分查找(折半查找)探究学习

1.引入 当我们想要查找在一个数组中某一个特定的数它的下标是什么的时候&#xff0c;我们最先想的方法是遍历数组&#xff0c;如下&#xff1a; #include<stdio.h> #include<string.h> int main() { int arr[10]{1,2,3,4,5,6,7,8,9,10}; int key 8;//要找的数是8…...

Android : 异常记录

查询大数据时 报错 android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos0, totalRows1解决办法&#xff1a;cursor DB.rawQuery("select * from " DBhelpUtil.TABLE_NAME" where id ?",new String[]…...

西南科技大学电路分析基础实验A1(元件伏安特性测试 )

目录 一、实验目的 二、实验设备 三、预习内容(如:基本原理、电路图、计算值等) 1、测定线性电阻的伏安特性 2、二极管伏安特性测试 3、测定实际电压源的伏安特性 四、实验数据及结果分析(预习写必要实验步骤和表格) 1、测定线性电阻的伏安特性 2、二极管伏安特性测…...

【Java】泛型的简单使用

文章目录 一、包装类1.基本数据类型和对应的包装类2.自动装箱和自动拆箱3.手动装箱和手动拆箱 二、什么是泛型三、泛型的使用四、裸类型&#xff08;Raw Type&#xff09;五、泛型是如何编译的六、泛型的上界七、泛型方法总结 一、包装类 在了解泛型之前我们先了解什么是包装类…...

注册Zoho Mail邮箱:优势与使用体验

如何注册Zoho Mail邮箱&#xff1f;要注册Zoho Mail邮箱&#xff0c;首先打开浏览器&#xff0c;访问Zoho Mail官网&#xff0c;点击页面右上角的“创建帐户”按钮。接下来&#xff0c;按照提示输入你的姓名、生日和性别&#xff0c;以及一个有效的手机号码或电子邮件地址。然后…...

第十四届蓝桥杯大赛国赛模拟题C++卷1

第十四届蓝桥杯大赛国赛模拟题C++卷1 一、选择题 1、在数组中,数组名表示( ) A.数组第1个元素的首地址 B.数组第2个元素的首地址 C.数组所有元素的首地址 D.数组最后1个元素的首地址答案:A.数组名是一个地址,指向第一个元素 2、下列叙述中正确的是( ) A.顺序存储结构的…...

基于UDP的TFTP文件传输

代码&#xff1a; #include <myhead.h>//实现下载功能 int download(int cfd,struct sockaddr_in sin) {char buf[516] ""; //定义资源包char fileName[128] ""; //定义文件名printf("请输入文件名:");scanf("%s",fileName…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...