堆的Top-K问题

news2024/10/5 20:15:12

⭐️ TOP-K问题

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

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

如果数据量过大,排序的方式就不太可取了。

思路:使用数据中的前 k k k 个元素来建堆。

  • k k k 个最大的元素,建小堆
  • k k k 个最小的元素,建大堆

如果要找前 k k k 个最大元素,用剩余的 n − k n - k nk 个元素依次与堆顶元素来比较,若比堆顶元素还大,则入堆向下调整,由于是小堆,所以大的数据都在堆底,所以最后堆里的数据就是前 k k k 个最大的元素。
那么找最大元素建大堆有什么问题?如果建的是大堆,堆顶假设已经是前 k k k 个最大的元素,那么依次与堆顶比较,第二大的元素根本进不了堆。反之同理。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>

// 向下调整算法
void AdjustDown(HeapDataType* data, int size, int parent) {
	assert(data);

	// 默认左孩子最小
	int child = parent * 2 + 1;
	while (child < size) {
		// 判断左孩子和右孩子谁更小
		// 若右孩子小则改变child 右孩子不能越界
		if ( (child + 1 < size) && (data[child + 1] < data[child]) ) {
			child++;
		}

		// 最小的孩子是否比父节点小
		if (data[child] < data[parent]) {
			// 交换
			Swap(&data[child] , &data[parent]);
			// 迭代
			parent = child;
			child = parent * 2 + 1;
		}
		else {
			// 父节点 <= 最小的孩子节点
			break;
		}
	}

}

void TopK(int* a, int n, int k)
{
	assert(k > 0);
	int* heap = (int*)malloc(sizeof(int) * k);
	assert(heap);
	for (int i = 0; i < k; i++) {
		heap[i] = a[i];
	}
	// 建堆 用a中前k个元素建堆
	for (int i = (k - 1 - 1) / 2; i >= 0; i--) {
		AdjustDown(heap , k , i);
	}
	// 将剩余n-k个元素依次与堆顶元素交换,不满则则替换
	for (int i = k; i < n; i++) {
		if (a[i] > heap[0]) {
			heap[0] = a[i];
			AdjustDown(heap , k , 0);
		}
	}

	// 打印
	for (int i = 0; i < k; i++) {
		printf("%d " , heap[i]);
	}
	printf("\n");
}

// 模拟数据
void TopKTest()
{
	int n = 10000;
	int* a = (int*)malloc(sizeof(int) * n);
	assert(a != NULL);
	srand((unsigned int)time(NULL));
	for (int i = 0; i < n; ++i)
	{
		a[i] = rand() % 1000000;
	}
	a[5] = 1000000 + 1;
	a[1231] = 1000000 + 2;
	a[531] = 1000000 + 3;
	a[5121] = 1000000 + 4;
	a[115] = 1000000 + 5;
	a[2335] = 1000000 + 6;
	a[9999] = 1000000 + 7;
	a[76] = 1000000 + 8;
	a[423] = 1000000 + 9;
	a[3144] = 1000000 + 10;
	TopK(a , n, 10);

	free(a);
	a = NULL;
}

int main () {

	TopKTest();
	
}

在这里插入图片描述


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

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

相关文章

TikTok引流的新玩法,用AdsPower打开新大陆!

做跨境电商的人都知道&#xff0c;天上不会掉流量&#xff0c;想要产品火&#xff0c;就必须要引流。大佬的一个产品动不动就几千几万的观看量&#xff0c;可是自己的产品却无人问津。他们到底怎么做到的呢&#xff1f;很简单&#xff0c;注册AdsPower和TikTok的账号&#xff0…

el-input输入框的那些事

vue3element-plustses6 此帖只为记录开发中遇到的需求&#xff0c;技术问题&#xff0c;坑 1、文本域禁止自由拉伸 1、文本域禁止自由拉伸 el-input有一个枚举类型的resize属性&#xff0c;控制拉伸&#xff0c;‘none’ | ‘both’ | ‘horizontal’ | ‘vertical’&#xf…

找实拍高清视频网站,我推荐这6个

本期推荐6个高清视频素材网站&#xff0c;视频剪辑、自媒体必备&#xff0c;建议收藏~ 菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是一个设计网站&#xff0c;但它还有非常丰富的视频和音频素材&#xff0c;视频素材全部都是高清无水印&#xff0…

暑期代码每日一练Day1:Leetcode415. 字符串相加

题目 415. 字符串相加 分析 题目意思是给你两个纯数字 字符串&#xff08;表示的是一个有意义的正整数&#xff09;&#xff0c;让你算出这两个字符串表示的数字的和&#xff0c;最后返回以字符串表示的结果&#xff0c;其中的过程不能直接将初始给定的两个字符串直接转化为…

ORB+FLANN

FLANN 代表 近似最近邻的快速库。它包含针对大型数据集中的快速最近邻搜索和高维特征优化的算法集合。对于大型数据集&#xff0c;它比BFMatcher工作得更快。 对于基于 FLANN 的匹配器&#xff0c;我们需要传递两个字典&#xff0c;指定要使用的算法、相关参数等。第一个是Ind…

2024考研408-操作系统 第三章-内存管理 学习笔记

文章目录 一、内存管理基础1.1、内存的基础知识1.1.1、什么是内存&#xff1f;有何作用&#xff1f;1.1.2、进程运行的基本原理1.1.2.1、指令的工作原理1.1.2.2、理解逻辑地址与物理地址1.1.2.3、从写程序到程序运行1.1.2.4、三种链接方式&#xff08;静态、转入时动态、运行时…

openssl源码编译输出库-guidance-傻瓜式教程

目标&#xff1a; 下载openssl源码 编译输出目标版本&#xff0c;例如使用Android NDK编译输出Android使用的32位的库 1、下载源码 git clone https://github.com/openssl/openssl.git -b openssl-3.0.9 2、 请下载Linux版本的Android NDK 请下载Linux版本的Android NDK, 并完…

没看完这篇文章,别说你会用Ping

中午好&#xff0c;我的网工朋友。 网工生活里每天都和ping打交道&#xff0c;ping来ping去&#xff0c;很多人知道ping&#xff0c;却不知道怎么把ping用出更多花样出来。 今天&#xff0c;我特地给你关于ping命令的使用大全&#xff0c;在更多不同的项目场景里&#xff0c;…

解决访问127.0.0.1时,提示“127.0.0.1 拒绝了我们的连接请求”

目录 问题描述 解决方案 问题描述 我电脑是win10系统&#xff0c;刚刚在访问http://127.0.0.1时&#xff0c;浏览器显示“127.0.0.1 拒绝了我们的连接请求”&#xff0c;为何访问本机IP显示拒绝访问&#xff1f; 解决方案 1. windows徽标 I 打开设置&#xff0c;选择“应用…

3ds max高级教程:创建带有骨骼动画的机器人模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 然而&#xff0c;下面我们示例机器人腿的第一个版本不是很现实&#xff0c;因为它会像没有肌肉的骨骼结构一样坍塌。在第二个版本中&#xff0c;我们将添加一些机器人“肌肉”&#xff0c;第三个版本将包括…

分布式运用存储系统Ceph

一、ceph的相关知识 1.ceph介绍与简介 Ceph是一个开源的分布式存储解决方案&#xff0c;旨在提供可扩展性、高性能和强大的数据可靠性。它采用了一种分布式对象存储架构&#xff0c;能够同时提供块存储和文件存储的功能。 Ceph使用C语言开发&#xff0c;是一个开放、自我修复和…

Makefile文件编写

文章目录 格式自动检查更新效率变量模式匹配函数clean 格式 目标&#xff1a;依赖 tab 命令 自动检查更新 当有文件发生修改后&#xff0c;重新make会自动对发生修改的依赖进行编译 效率 由于在 make时会进行检查更新&#xff0c;对于有修改的依赖会重新编译&#xff0c;为…

定位理论:引领企业变革的幕后推手

在商业的海洋中&#xff0c;如何能让你的企业像一座明亮的灯塔&#xff0c;独特而引人注目?这就需要我们掌握一种强大的工具——定位理论。那么&#xff0c;定位理论究竟是什么?我们为什么要学习它?它如何能为我们的企业创造价值?今天&#xff0c;让我们一起深入探索定位理…

vue3组件引用使用的坑

今天准备用el-tabs写个页面&#xff0c;发现点击后组件怎么都显示不了&#xff0c;后来才发现是组件引用的原因 这是页面是显示的效果&#xff1a; 乍一看确实是对的。。。 但是当我点击完这三个tab后再重新点击道路管理后&#xff0c;有意思的出现了&#xff1a; one组件消失…

UE4/5AI制作基础AI(适合新手入门,运用黑板,行为树,ai控制器,角色类,任务)

目录 制作流程 第一步&#xff1a;创建资产 然后创建一个AIController 之后创建一个黑板和行为树&#xff1a; 第二步&#xff1a;制作 黑板 行为树 任务 运行行为树 结果 制作流程 第一步&#xff1a;创建资产 第一步直接复制你的人物蓝图&#xff0c;做一个npc&…

【网关】ShenYu Gateway入门Demo体验,ShenYu网关2.6.0直接调用Dubbo服务

本次为新开源框架接入ShenYu网关做基础学习指导&#xff0c;特地来下载官网的demo体验一把&#xff0c;具体是想通过网关泛化调用dubbo服务。本次使用的是最新版本2.6.0。 官网文档&#xff1a; 如何通过 Apache ShenYu 网关代理 Dubbo 服务 | Apache Dubbo 环境准备 第一步&a…

nvm安装和使用,对node.js版本进行切换控制

文章目录 前言一、nvm是什么&#xff1f;二、安装三、nvm命令说明nvm ls&#xff08;查看已安装版本&#xff09;nvm list available&#xff08;查看可下载安装的最新版本列表&#xff09;nvm current&#xff08;查看当前使用的版本&#xff09;nvm install&#xff08;下载安…

【Linux】网络基础之UDP协议

目录 &#x1f308;前言&#x1f338;1、传输层&#x1f33a;2、重谈端口号&#x1f368;2.1、端口号范围划分&#x1f367;2.2、认识知名端口号 &#x1f340;3、UDP协议&#x1f368;3.1、UDP协议报文结构&#x1f369;3.2、UDP协议的特点&#x1f36a;3.3、基于UDP的应用层协…

SQL篇-03_SQL必知必会-13_组合查询

SQL106 将两个 SELECT 语句结合起来&#xff08;一&#xff09; 描述 表OrderItems包含订单产品信息&#xff0c;字段prod_id代表产品id、quantity代表产品数量 prod_id quantity a0001 105 a0002 100 a0002 200 a0013 1121 a0003 10 a0003 19 a0003 5 BNBG 10002 【问题】将两…

移动卫生间有人无人自动采集方案

互联网和物联网技术的不断普及&#xff0c;以及新技术的不断更新迭代&#xff0c;为我们的生活带来了诸多便利和改变。在这个信息时代&#xff0c;我们希望通过采用更先进的技术来建设智慧厕所&#xff0c;以满足人们对卫生设施的高品质需求。其中&#xff0c;物联网技术、传感…