【数据结构】二叉树顺序存储结构堆的应用以及解决TOP-K问题

news2024/9/21 21:47:33

在这里插入图片描述

文章目录

  • 前言
  • 1. 堆的应用
    • 1.1 堆排序
    • 1.2 TOP-K问题
  • 2. 结语

前言

前面我们学习了堆这个数据结构,这种数据结构是一种顺序结构存储的完全二叉树,现在我们来看一看堆的应用。

1. 堆的应用

1.1 堆排序

版本一:基于已有数组建堆、取堆顶元素完成排序版本

// 1、需要堆的数据结构
// 2、空间复杂度 O(N)
void HeapSort(int* a, int n)
{
	HP hp;
	for (int i = 0; i < n; i++)
	{
		HPPush(&hp, a[i]);
	}
	int i = 0;
	while (!HPEmpty(&hp))
	{
		a[i++] = HPTop(&hp);
		HPPop(&hp);
	}
	HPDestroy(&hp);
}

该版本有⼀个前提,必须提供有现成的数据结构堆

版本二:数组建堆,首尾交换,交换后的堆尾数据从堆中删掉,将堆顶数据向下调整选出次大的数据

// 升序,建大堆
// 降序,建小堆
// O(N*logN)
void HeapSort(int* a, int n)
{
	// a数组直接建堆 O(N)
	for (int i = (n - 1 - 1) / 2; i >= 0; --i)
	{
		AdjustDown(a, n, i);
	}
// O(N*logN)
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		--end;
	}
}

堆排序时间复杂度计算

在这里插入图片描述

分析

第1层, 2 0 2^0 20个结点,交换到根结点后,需要向下移动0层

第2层, 2 1 2^1 21个结点,交换到根结点后,需要向下移动1层

第3层, 2 2 2^2 22个结点,交换到根结点后,需要向下移动2层

第4层, 2 3 2^3 23个结点,交换到根结点后,需要向下移动3层

第h层, 2 h − 1 2^{h-1} 2h1个结点,交换到根结点后,需要向下移动h-1层

通过分析发现,堆排序第二个循环中的向下调整与建堆中的向上调整算法时间复杂度计算一致,此处不再赘述。因此,堆排序的时间复杂度为 O ( n + n ∗ l o g n ) O(n+n∗logn) O(n+nlogn),即 O ( n l o g n ) O(nlogn) O(nlogn)

💡 堆排序时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

1.2 TOP-K问题

TOP-K问题:即求数据集合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。

比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。

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

(1)用数据集合中前K个元素来建堆

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

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

(2)用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素

将剩余N-K个元素依次与堆顶元素比完之后,堆中剩余的K个元素就是所求的前K个最小或者最大的元素

如下图所示

在这里插入图片描述

代码实现

void CreateNDate()
{
	// 造数据
	int n = 100000;
	srand(time(0));
	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 x = (rand() + i) % 1000000;
		fprintf(fin, "%d\n", x);
	}
	fclose(fin);
}
void topk()
{
	printf("请输⼊k:>");
	int k = 0;
	scanf("%d", &k);
	const char* file = "data.txt";
	FILE * fout = fopen(file, "r");
	if (fout == NULL)
	{
		perror("fopen error");
		return;
	}
	int val = 0;
	int* minheap = (int*)malloc(sizeof(int) * k);
	if (minheap == NULL)
	{
		perror("malloc error");
		return;
	}
	for (int i = 0; i < k; i++)
	{
		fscanf(fout, "%d", &minheap[i]);
	}
	// 建k个数据的小堆
	for (int i = (k - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(minheap, k, i);
	}
	int x = 0;
	while (fscanf(fout, "%d", &x) != EOF)
	{
	// 读取剩余数据,⽐堆顶的值大,就替换他进堆
		if (x > minheap[0])
		{
			minheap[0] = x;
			AdjustDown(minheap, k, 0);
		}
	}
	for (int i = 0; i < k; i++)
	{
		printf("%d ", minheap[i]);
	}
	fclose(fout);

}

💡 时间复杂度为 O ( n ) = k + ( n − k ) l o g 2 k O(n)=k+(n−k)log_2k O(n)=k+(nk)log2k

2. 结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!
在这里插入图片描述

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

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

相关文章

Linux CentOS 部署Docker

1. yum 配置 &#xff08;1&#xff09;更新yum yum update -y 如果不升级更新yum 可能在后续docker部署后再更新容器会出现oci runtime error等 &#xff08;2&#xff09;安装yum工具类准备 yum install -y yum-utils device-mapper-persistent-data lvm2 &#xff08;3&…

不再为存储‘分家’烦恼,teamOS让你的数据全家桶,一键即达

在数字化浪潮下&#xff0c;数据管理已成为企业运营的核心环节。作为企业管理者&#xff0c;我深知数据的重要性&#xff0c;也明白数据管理所面临的种种挑战。 最近开始使用企业网盘&#xff0c;在体验了一段时间后&#xff0c;目前来说&#xff0c;让我比较满意的就是可道云…

C盘红了怎么办?C盘快满了怎么办?如何提高电脑运行速度?

在电脑的日常使用中&#xff0c;C盘红了&#xff08;也就是C盘满了&#xff09;&#xff0c;那是常有的事&#xff0c;本文将详述一下&#xff0c;C盘红了之后的多种处理方法&#xff0c;只要你看完了&#xff0c;就必有一款适合你。 一、系统自带的磁盘清理 当你的C盘红了&…

vue3 置空a-select数据

置空a-select数据 项目中遇到需求&#xff0c;选择第一个下拉框后&#xff0c;发请求获取数据第二个下拉框数据&#xff08;第二个下拉框已选的情况下需要置空&#xff09;。 解决方法&#xff1a;formData.value.checkUser {value: “” ,label:“”} <a-col :span"…

Win32中的字符串

ANSI字符和Unicode字符 在Visual C中&#xff0c;用CHAR来表示8位ANSI字符&#xff0c;用WCHAR来表示16位Unicode字符&#xff08;宽字符&#xff09; 1 typedef char CHAR 2 typedef wchar_t WCHAR 一般常用的定义如下 TypedefDefinitionCHARcharPSTR or LPSTRchar*PCSTR o…

一个跨平台的换源工具,一键更换操作系统上的软件源或镜像源

大家好&#xff0c;今天给大家分享的是一个全平台通用换源工具chsrc&#xff0c;旨在为各种软件在不同平台上提供从命令行进行换源的功能。 项目介绍 chsrc支持 Linux&#xff08;包括麒麟、openEuler、deepin 等&#xff09;、Windows、macOS、BSD 等多种操作系统&#xff0c…

MySQL数据类型-介绍

MySQL 支持多种数据类型&#xff0c;这些数据类型可以根据它们所存储的数据类型大致分为几类&#xff1a;数值类型、日期和时间类型、字符串&#xff08;字符&#xff09;类型、空间数据类型以及JSON数据类型。 一、数据类型 1.整数类型 TINYINT&#xff1a;非常小的整数。例…

第 2 章:AJAX 的使用

AJAX 的使用 核心对象&#xff1a;XMLHttpRequest&#xff0c;AJAX 的所有操作都是通过该对象进行的。 1. 使用步骤 创建 XMLHttpRequest 对象 var xhr new XMLHttpRequest(); 设置请求信息 xhr.open(method, url);//可以设置请求头&#xff0c;一般不设置 xhr.setReques…

计算机网络八股文之TCP协议

TCP/IP模型 链路层 物理层&#xff1a;主要定义物理设备标准&#xff0c;如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流&#xff08;就是由1、0转化为电流强弱来进行传输&#xff0c;到达目的地后再转化为1、0&#xff0c;也就是我们…

WPS Office for Linux 12 个人版上线deepin 23商店:UI 视觉重构,新增多项 AI 功能

查看原文 全新WPS Office For Linux个人版&#xff08;12.1.0.17881&#xff09;与deepin 23的AI功能深度融合&#xff0c;正式上架在社区商店啦&#xff01; 这是 Linux 版本的一次里程碑式的重大更新。在产品能力层面上&#xff0c;在 deepin 23 上WPS Office 几乎实现了与 …

30天一次过PMP资料分享!2024备考PMP必看!!!

1、华为项目管理工具模板 2、PMP思维导图 3、PMBOK指南第七版-中文电子版 4、敏捷电子书&#xff08;含敏捷实践指南&#xff09; 5、300道敏捷题 6、PMBOK第六版章节思维导图 PMP备考攻略&#xff1a; 1. 充分了解PMP考试大纲&#xff1a; 详细了解PMP考试大纲&#xff0c;明…

IEEE Latex模板子图标题字体修改

在进行IEEE期刊论文排版时&#xff0c;可能会用到子图&#xff0c;但官方的Latex模板中&#xff0c;子图标题字体与字号和图片标题不同&#xff0c;排版出来不美观&#xff0c;下面介绍一个简单方法解决这一问题。 在tex文件头部找到这一条代码&#xff1a; \usepackage[capti…

Spring学习(四)-AOP

Spring学习&#xff08;四&#xff09;-AOP –2020年06月26日 一、AOP的概念 面向切面编程。 利用AOP可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各部分之间的耦合度降低&#xff0c;提高程序的可重用性&#xff0c;同时提高了开发的效率。 通俗描述&am…

Mendix 创客访谈录|Mendix赋能汽车零部件行业:重塑架构,加速实践与数字化转型

在当前快速发展的技术时代&#xff0c;汽车行业正经历着前所未有的数字化转型。全球领先的汽车零配件制造商面临着如何利用最新的数字技术优化其制造车间管理的挑战。从设备主数据管理到生产执行工单管理&#xff0c;再到实时监控产量及能耗&#xff0c;需要一个灵活、快速且高…

IF 17.1| 爱竹人士一眼就心动的数据库!

竹子具有重要的经济和生态重要性&#xff0c;并为国际贸易做出贡献。BambooGDB是现有的竹基因组学资源&#xff0c;提供了基于毛竹个体参考基因组草图的信息。然而&#xff0c;我们需要的是一种资源来加强竹科多基因组组装&#xff0c;使研究人员能够通过分支特异性比较基因组研…

Qt基础类02-坐标类QPointF

Qt基础类02-坐标类QPointF 摘要基本信息重要成员函数举例6个程序全貌QPointF::QPointF()static qreal QPointF::dotProduct(const QPointF &p1, const QPointF &p2)bool QPointF::isNull() constconst QPointF operator*(const QPointF &point, qreal factor)const…

程序员都必须要知道的 8个常见数据结构

1. 数组&#xff1a;多功能主力 什么是数组&#xff1f; 数组可能是编程中最基本、使用最广泛的数据结构。将数组视为存储在连续内存位置的项目集合。它就像学校里一排储物柜&#xff0c;每个储物柜&#xff08;元素&#xff09;按顺序编号&#xff0c;可容纳一个物品。 数组…

Qt实现图表绘制

来来来&#xff0c;今天新学习到了一个好东西&#xff0c;就是图表的绘制&#xff0c;这玩意在一般的项目开发中的使用频率还是非常高滴&#xff0c;毕竟相对于数字来说&#xff0c;这个东西更能体现出数据的变化&#xff0c;主要是耐看啊&#xff01;&#xff01;&#xff01;…

9月跨境营销热点日历!出海选品指南

9月1日 澳大利亚父亲节 澳大利亚父亲节是一个特殊的日子&#xff0c;人们用来表达对父亲的感激之情。 礼物用品&#xff1a;手表盒、雪茄盒、红酒架、腰带等。除了前面举例的几款&#xff0c;还能从哪里获取选品的灵感呢&#xff1f;店雷达给大家提供一些实操的选品思路&…

p38激酶在癌症研究中的进展

前 言&#xff1a; p38是丝裂原活化蛋白激酶MAPK家族的重要成员。p38的激活需要在Thr180、Tyr182位点发生磷酸化&#xff0c;在细胞增殖、代谢、凋亡等方面发挥重要作用&#xff0c;与多种肿瘤发展相关。 MAPK&#xff08;丝裂原活化蛋白激酶&#xff09;通路参与调控与癌症发…