二叉树-堆应用(1)

news2024/11/15 11:47:34

目录

堆排序

整体思路

代码实现

Q1建大堆/小堆

Q2数据个数和下标

TopK问题

整体思路

代码实现

Q1造数据CreateData

Q2建大堆/小堆


  • 建堆的两种方法
  • 这里会用到前面的向上/向下调整/交换函数。向上调整&向下调整算法-CSDN博客

堆排序

整体思路

  • 建堆(直接把数组搞成堆)升序:建大堆  降序:建小堆
  • 利用堆删除的思想来进行堆排序 (就是模拟堆删除的过程,但是实际并不删除堆)
  • 1:交换头尾
  • 2:向下调整(除去最后一个元素&&最后一个元素已经排好序了)
  • 3:循环重复上述过程
  • 建队有两种方法:插入(向上调整建堆)/向下调整建堆(下篇细讲)
  • 建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。

代码实现

//堆排序:本质直接在数组里面排序
void test1(int* a, int size)
{
	//方法1的时间/空间复杂度都很低
	//方法2
	//1.向上调整建堆 建堆--建的小堆--降序 建大堆--升序
	for (int i = 0; i < size; i++)
	{
		AdjustUp(a, i);
	}

	//1.向下调整建堆
	for (int i = (size - 1 - 1) / 2; i >= 0; i--)//i=0的时候到达根节点此时就是全部向下调整
	{
		Adjustdown(a, size, i);//这里的size不确定,但是肯定比size小所以取最大就size
	}
	//2.
	while (size)
	{
		//交换
		Swap(&a[0], &a[size - 1]);
		//向下调整(除去已经排序好的元素)
		Adjustdown(a, size-1, 0);
		//到达下一个交换的位置
		size--;
	}
}
int main()
{
	int a[10] = { 2,3,7,5,4,3,9,7,6,10 };
	int size = sizeof(a) / sizeof(a[0]);//10个数==最后一个数的下一个数的下标
	test1(a, size);

	//3.打印
	for (int i = 0; i < size; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

Q1建大堆/小堆

升序:建大堆 

降序:建小堆

 

Q2数据个数和下标

size:指向最后一个元素的下一个位置

交换首位元素:最后一个元素的下标size-1

出去排好的元素向下调整个数:为size-1(-1除去排好的元素) 

 

TopK问题

TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。

整体思路

对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决,基本思路如下:

  • 用数据集合中前K个元素来建堆
  • 前k个最大的元素,则建小堆;前k个最小的元素,则建大堆
  • 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素
  • 将剩余N-K个元素依次与堆顶元素比完之后,堆中剩余的K个元素就是所求的前K个最小或者最大的元素。

代码实现

void CreateDate()//创造数据
{
	int n = 1000000;
	srand((unsigned int)time(NULL));//随机数的种子
	//打开文件
	const char* file = "data.txt";//文件指针
	FILE* fin = fopen(file, "w");//以写的形式打开文件状态指针
	if (fin == NULL)//打开失败
	{
		perror("fopen error");
		return;
	}
	//写文件
	for (int i = 0; i < n; i++)
	{
		int r = (rand() + i) % 1000000;
		fprintf(fin, "%d\n", r);
	}
	//关闭文件
	fclose(fin);
}

void test2(int K)
{
	//打开文件
	const char* file = "data.txt";//文件指针
	FILE* fout = fopen(file, "r");//以写的形式打开文件状态指针
	if (fout == NULL)//打开失败
	{
		perror("fopen error");
		return;
	}

	//读取文件
	//开辟数组空间存放小堆
	int* a = (int*)malloc(sizeof(int) * K);
	if (a == NULL)
	{
		perror("malloc error");
		return;
	}

	for (int i = 0; i < K; i++)
	{
		fscanf(fout, "%d", &a[i]);//读取放入数组
		AdjustUp(a, i);//建小堆
	}


	//一直读取并且比较
	int n = 0;
	while (fscanf(fout,"%d", &n) != EOF)
	{
		if (a[0] < n)
		{
			a[0] = n;
			Adjustdown(a, K, 0);
		}
	}

	//打印
	int i = 0;
	for (i = 0; i < K; i++)
	{
		printf("%d ", a[i]);
	}

	//释放空间/关闭文件
	free(a);
	fclose(fout);
}



int main()
{
	//CreateDate();//创造数据
	int K = 8;
	test2(K);//TopK问题--小堆--取前K个最大的数
	return 0;
}

Q1造数据CreateData

  • 打开文件
  • 写文件
  • 关闭文件
  • 随机数&随机数的种子&产生随机数
  • 随机数最多3万个
  • 文件指针&文件状态指针
  • 想要产生的随机数在100万以内:%100万
  • 测试:去文件里面修改值大于>100万的数,查看是否打印出来的是修改后的数据。
void CreateDate()//创造数据
{
	int n = 1000000;
	srand((unsigned int)time(NULL));//随机数的种子
	//打开文件
	const char* file = "data.txt";//文件指针
	FILE* fin = fopen(file, "w");//以写的形式打开文件状态指针
	if (fin == NULL)//打开失败
	{
		perror("fopen error");
		return;
	}

	//写文件
	for (int i = 0; i < n; i++)
	{
		int r = (rand() + i) % 1000000;
		fprintf(fin, "%d\n", r);
	}

	//关闭文件
	fclose(fin);
}

Q2建大堆/小堆

前k个最大的元素,则建小堆

前k个最小的元素,则建大堆

 

🙂感谢大家的阅读,若有错误和不足,欢迎指正

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

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

相关文章

安全通道堵塞识别摄像机

当建筑物的安全通道发生堵塞时&#xff0c;可能会给人员疏散和救援带来重大隐患。为了及时识别和解决安全通道堵塞问题&#xff0c;专门设计了安全通道堵塞识别摄像机&#xff0c;它具有监测、识别和报警功能&#xff0c;可在第一时间发现通道堵塞情况。这种摄像机通常安装在通…

LeetCode--171

171. Excel 表列序号 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: columnTitle "A" 输出:…

WebGL技术开发框架

WebGL技术框架是一些提供了便捷API和工具的库&#xff0c;用于简化和加速在Web浏览器中使用WebGL进行3D图形开发。以下是一些常用的WebGL技术框架&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Th…

ElementUI 组件:Layout布局(el-row、el-col)

ElementUI安装与使用指南 Layout布局 点击下载learnelementuispringboot项目源码 效果图 el-row_el-col.vue页面效果图 项目里el-row_el-col.vue代码 <script> export default {name:el-row_el-col 布局 }</script><template><div class"roo…

Python代码重构库之rope使用详解

概要 Python是一门强大的编程语言,但在大型项目中,维护和重构代码可能会变得复杂和困难。为了提高开发人员的效率和准确性,有许多工具可用于辅助代码重构和智能代码补全。其中之一是Python Rope。 Python Rope是一个用于Python编程语言的强大工具,它提供了丰富的功能,包…

STM32低功耗模式

一、低功耗模式介绍 STM32 的低功耗模式有 3 种&#xff1a; 1)睡眠模式&#xff08;CM3 内核停止&#xff0c;外设仍然运行&#xff09; 2)停止模式&#xff08;所有时钟都停止&#xff09; 3)待机模式&#xff08;1.8V 内核电源关闭&#xff09; 在这三种低功耗模式中&#…

[机器学习]简单线性回归——最小二乘法

一.线性回归及最小二乘法概念 2.代码实现 # 0.引入依赖 import numpy as np import matplotlib.pyplot as plt# 1.导入数据 points np.genfromtxt(data.csv, delimiter,) # points[0,0]# 提取points中的两列数据&#xff0c;分别作为x&#xff0c;y x points[:, 0] y poi…

TSINGSEE青犀智能分析网关V4如何利用AI智能算法保障安全生产、监管,掀开安全管理新篇章

旭帆科技的智能分析网关V4内含近40种智能分析算法&#xff0c;包括人体、车辆、消防、环境卫生、异常检测等等&#xff0c;在消防安全、生产安全、行为检测等场景应用十分广泛。如常见的智慧工地、智慧校园、智慧景区、智慧城管等等&#xff0c;还支持抓拍、记录、告警、语音对…

数据库运维工作量直接减少 50%,基于大模型构建智能问答系统的技术分享

本文源自百度智能云数据库运维团队的实践&#xff0c;深入探讨了基于大模型构建「知识库智能问答系统」的设计过程和应用。 全文包括了总体的技术方案选型、各个模块的设计实现、重点难点问题的突破、以及目前的落地场景应用等。 该系统自从内部上线以来&#xff0c;整体的回…

【Vue】vue项目中使用tinymce富文本组件(@tinymce/tinymce-vue)

【Vue】vue项目中使用tinymce富文本组件&#xff08;tinymce/tinymce-vue&#xff09; 一、安装二、前期准备工作1、去[官网](https://www.tiny.cloud/get-tiny/language-packages/)下载语言包&#xff1b;2、将下载的语言包复制到项目中的assets&#xff08;存放路径您随意&am…

SAP的FAGLGVTR执行出现视图名称FGLV_BCF_ALLB不存在

这个问题找了很久没有找到问题所在&#xff0c;查阅了很多资料也没有 执行完FAGLGVTR出现视图dump&#xff0c;原因是CB的增强字段不知道什么原因在视图没有保持一致 往前面溯源的时候 FGLV_BCF_ALLB10 FGLV_BCF_PER0B FGLV_BCF_PER0B10 FGLV_BCF_PER0 前面FGLV_BCF_…

三子棋游戏小课堂

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今天的主菜是&#xff0c;C语言实现的三子棋小游戏&#xff0c; 所属专栏&#xff1a; C语言知识点 主厨的主页&#xff1a;Chef‘s blog 前言&…

SpringBoot集成H2数据库

1&#xff09;添加H2的依赖 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>compile</scope> </dependency>2&#xff09;添加连接配置&#xff0c;启用web控制台 spring:datasource:url…

短信验证码接口被恶意攻击了该怎么办?

在企业运行的时候&#xff0c;安全意识和风险防范机制一定要做好。在2019年SUBMAIL短信平台就有几个客户的短信验证码接口遭到了恶意攻击&#xff0c;如果没有做好防范就会造成一定程度的损失。 那么&#xff0c;当短信验证码接口被恶意攻击的时候&#xff0c;该怎么办呢&#…

【OCR软件进化史】文字、表格、公式图片识别并与ChatGPT交互

第1年 由于日常工作需要大量的文本处理&#xff0c;身为一个全栈pythoner是绝不允许手动复制粘贴。 于是&#xff0c;在2021年&#xff0c;封装了第1版的文字、表格、公式图片识别工具&#xff08;第1版&#xff09;&#xff1a; 第1版做的比较粗糙&#xff0c;就是封装了百度…

STC8G1K17A点灯

目录 1设计目的 2STC8G1K17A介绍 3代码实现 4效果测试 1设计目的 通用的STC89C52单片机由于封装太大&#xff0c;而且还需要外加晶振才能工作&#xff0c;对于一些要求不高的场合&#xff0c;就显得很笨重&#xff0c;所以&#xff0c;此次设计就是寻找一个代替产品&#x…

Kotlin 协程:用源码来理解 ‘viewModelScope‘

Kotlin 协程&#xff1a;用源码来理解 ‘viewModelScope’ Kotlin 协程是 Kotlin 语言的一大特色&#xff0c;它让异步编程变得更简单。在 Android 开发中&#xff0c;我们经常需要在后台线程执行耗时操作&#xff0c;例如网络请求或数据库查询&#xff0c;然后在主线程更新 UI…

PHP的线程安全与非线程安全模式选哪个

曾经初学PHP的时候也很困惑对线程安全与非线程安全模式这块环境的选择&#xff0c;也未能理解其中意。近来无意中看到一个教程对线程安全&#xff08;饿汉式&#xff09;&#xff0c;非线程安全&#xff08;懒汉式&#xff09;的描述&#xff0c;虽然觉得现在已经能够很明了透彻…

Python算法题集_最大子数组和

本文为Python算法题集之一的代码示例 题目53&#xff1a;最大子数组和 说明&#xff1a;给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。…

RS485自动收发电路震荡的问题

电路 设计初衷 电源5V 选择5V的原因&#xff0c;差分2.5V比1.5V可以提高传输能力 TTL输入 3.3V电平满足需求 TTL输出 4.5V了&#xff0c;MCU是3.3V平台 这样就分为两种情况 MCU接收端可以容忍5V输入 MCU接收端不可以容忍5V输入&#xff0c;就要进行电压转换&#xff0c;我这里使…