堆的应用-----Top k 问题

news2024/12/27 8:48:03

目录

前言

Topk问题

1.问题描述

2.解决方法

3.代码实现(C/C++) 


前言

在人工智能算法岗位的面试中,TopK是问得最多的几个问题之一:

到底有几种方法?

这些方案里蕴含的优化思路究竟是怎么样的?

为啥TopK这么受欢迎呢?究其原因,还是因为它不仅在AI领域广泛应用,比如max pooling,mAP计算等;还涵盖了算法专业的很多必备知识,比如快速排序,二分查找,分治减治,大小顶堆等;一些适当的变换,还可以考察应聘者的思维灵活度。

下面的文章转自架构师之路,是笔者见过此类文章中总结的最透彻的一篇,为了行文流畅,文章有增删。

        前段时间我们学习过了数据结构堆以及堆排序算法,堆是一种完全二叉树,那今天我们学习堆的应用,解决topk问题,下面就一起来看看吧。

(相关链接:数据结构-----堆(完全二叉树)-CSDN博客)

Topk问题

1.问题描述

从arr[1, n]这n个数中,找出最大的k个数,这就是经典的TopK问题。

看上去是不是非常直白明了呢?那确实是,但是怎么去解决这个问题?当然我们会想到排序去处理,把这个数组进行排序,然后直接就可以找到了。但是排序的话会把一些不必要的数进行排序处理,也就是说时间复杂度会比较大,但是如果我们单单对前k个大的数字进行单独处理,那效果是不是更好呢?下面我们就看一看堆是怎么实现的。

2.解决方法

我们获取到当前的数组的时候,然后就创建一个大堆,如图所示,其特点就是上面的元素比下面的元素要大。创建好大堆之后,我们就可以进行后继处理。当前大堆最大的元素就是在第一个位置,我们把第一个位置(最大元素),与最后一个位置的元素进行位置交换,然后把最后一个位置的元素踢出当前的堆,在前面n-1个元素里面再找最大值即可,依次重复以上的操作,执行k次就完成了问题的解决。

3.代码实现(C/C++) 

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

//交换数字
void swap(int* a, int* b) {
	int t = *a;
	*a = *b;
	*b = t;
}

//向下调整
void adjust_down(int* arr, int par, int n) {
	int child = par * 2 + 1;
	while (child < n) {
		if (arr[child] < arr[child + 1] && child + 1 < n)
			child++;
		if (arr[par] < arr[child]) {
			swap(&arr[par], &arr[child]);
			par = child;
			child = par * 2 + 1;
		}
		else
			break;
	}
}

//函数接口
void Top_k(int* arr, int n,int k) {
	//先创建这个堆
	for (int i = (n - 1) / 2; i >= 0; i--) {
		adjust_down(arr, i, n);
	}
	//然后就是获取当前堆中的最大值
	int end = n - 1;
	int count = 0;
	while (count < k) {
		//当前最大值下标为0,把最大值的数与最后一个数进行交换
		swap(&arr[end], &arr[0]);
		//end--,把最大值踢出当前堆,然后从剩下的n-1个数字的堆继续找最大值
		adjust_down(arr, 0, end);
		end--;
		count++;
	}
	printf("前%d大的数是:\n", k);
	for (int i = n - 1; i > n - 1 - count; i--) {
		printf("%d ", arr[i]);
	}
}

int main() {
	int arr[] = { 5,1,4,7,8,9,3,4,5,6,7,10,55 };
	int k = 3;
	Top_k(arr, sizeof(arr) / sizeof(int), k);
}

以上就是本期的全部内容了,我们下次见!

分享一张壁纸:

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

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

相关文章

OpenAI发布会,看看GPT又有哪些大动作!2023.11.7【浓缩精华】

ChatGPT GPT-4 Turbo其它applications 北京时间11月7日OpenAI首届开发者大会 GPT-4 Turbo Context length 支持12.8万个上下文contextMore control JSON模式 可复制输出 未来&#xff1a;在API中查看日志Better knowledge 平台启动检索 拥有截至2023年3月的知识New modaliti…

2020年12月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 下面哪个区域是“舞台区”? A:A B:B C:C D:D 答案:B 第2题 下面哪段程序可以随机切换三个背景? A: B: C: D:

2.1 Windows驱动开发:内核链表与结构体

在Windows内核中&#xff0c;为了实现高效的数据结构操作&#xff0c;通常会使用链表和结构体相结合的方式进行数据存储和操作。内核提供了一个专门用于链表操作的数据结构LIST_ENTRY&#xff0c;可以用来描述一个链表中的每一个节点。 使用链表来存储结构体时&#xff0c;需要…

搜狐2023年Q3营收1.45亿美元 宣布最高8000万美元股票回购计划

2023年11月13日&#xff0c;搜狐公司公布2023年第三季度财务报告。财报显示&#xff0c;搜狐公司第三季度总收入为1.45亿美元&#xff0c;其中&#xff0c;品牌广告收入为2200万美元&#xff0c;在线游戏收入为1.17亿美元&#xff1b;同时宣布为期两年&#xff0c;总金额最高为…

Code Former安装及使用

Code Former是南洋理工大学和商汤科技联合研究中心联合开发一款AI人脸修复算法&#xff0c;通过该算法&#xff0c;可以对已经模糊的图片进行人脸修复&#xff0c;找回斑驳的记忆 由于网上对于Code Former的封装&#xff0c;全都是要花钱&#xff0c;或者需要其他什么曲折的方式…

Pyside6/PYQT6如何实现无边框设计,解决无边框窗口无法移动和实现窗口拖拽改变大小的问题

文章目录 💢 问题 💢💯 解决方案 💯🍔 准备工作📚 setWindowFlags、setWindowFlag和setAttribute的区别🐾 操作步骤🐾 窗口无边框🐾 窗口透明🐾 实现窗口可移动🐾 实现窗口拖拽改变大小⚓️ 相关链接 ⚓️💢 问题 💢 有时候我们需要一个无边框的UI设…

转本考前4个月,手把手教你逆袭上岸

现在离转本考试的时间还剩下4个月&#xff0c;绝大多数同学会在之后的寒假期间全力学习&#xff0c;谁在这段时期懈怠&#xff0c;谁就丢掉了一半的分数。 不管是复习了很长一段时间&#xff0c;还是刚起步的同学&#xff0c;都有必要重新规划后面的复习。下面给大家讲讲&…

告别瞎忙+拖延,工作中必不可少的便签工具

在平常的工作中&#xff0c;很多人都会感慨&#xff0c;每天的工作都是在瞎忙&#xff0c;一天忙忙碌碌结束后发现仍旧有许多待完成的任务&#xff0c;也有一些人在工作中碌碌无为&#xff0c;消极怠工拖延时间&#xff0c;瞎忙拖延归根到底是没有提前将工作中的各项工作安排妥…

vscode使用flake8设置单行最长字符限制设置失败的问题

vscode使用flake8设置单行最长字符限制设置失败的问题 问题描述解决方案 问题描述 如图所示&#xff0c;使用flake8单行字数过长&#xff0c;就会有有红色底的波浪线 一般情况下很多教程都会让你在setting.json里面设置 但是我打开我的setting.json&#xff0c;发现我已经进…

List中的迭代器实现【C++】

List中的迭代器实现【C】 一. list的结构二. 迭代器的区别三. 迭代器的实现i. 类的设计ii. 重载iii. !重载iiii. begin()iiiii. end()iiiii. operator* 四.测试五. const迭代器的实现i. 实现5.2 优化实现 一. list的结构 其实按照习惯来说&#xff0c;应该要专门出一篇博客来写…

体验家XMPlus收购NPSMeter,稳固体验管理行业“领头羊”地位

2023年9月30日&#xff0c;体验家XMPlus&#xff08;以下简称“体验家”&#xff09;成功完成了对NPSMeter的收购。此次收购是中国客户体验管理&#xff08;CEM&#xff09;赛道进入快速发展以来的首单收购&#xff0c;标志着体验家在CEM领域的进一步扩张&#xff0c;旨在继续完…

2023亚太杯数学建模C题思路

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

三、机器学习基础知识:Python常用机器学习库(中文文本分析相关库)

文章目录 1、Jieba库1.1 主要函数1.2 词性标注1.3 关键词提取 2、WordCloud库2.1 常见参数2.2 词云绘制 文本分析是指对文本的表示及其特征的提取&#xff0c;它把从文本中提取出来的特征词进行量化来表示文本信息&#xff0c;经常被应用到文本挖掘以及信息检索的过程当中。 1、…

2.2 Windows驱动开发:内核自旋锁结构

提到自旋锁那就必须要说链表&#xff0c;在上一篇《内核中的链表与结构体》文章中简单实用链表结构来存储进程信息列表&#xff0c;相信读者应该已经理解了内核链表的基本使用&#xff0c;本篇文章将讲解自旋锁的简单应用&#xff0c;自旋锁是为了解决内核链表读写时存在线程同…

若依侧边栏添加计数标记效果

2023.11.13今天我学习了如何对若依的侧边栏添加技术标记的效果&#xff0c;如图&#xff1a; 我们需要用到两个页面&#xff1a; 先说子组件实现计数标记效果 1.item.vue <script> export default {name: MenuItem,functional: true,props: {icon: {type: String,defau…

使用Nginx和uwsgi在自己的服务器上部署python的flask项目

Nginx 是一个高性能的 HTTP 和反向代理服务。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发&#xff0c;性能是其最重要的考量指标&#xff0c;实现上非常注重效率&#xff0c;能经受…

竞赛选题 深度学习的口罩佩戴检测 - opencv 卷积神经网络 机器视觉 深度学习

文章目录 0 简介1 课题背景&#x1f6a9; 2 口罩佩戴算法实现2.1 YOLO 模型概览2.2 YOLOv32.3 YOLO 口罩佩戴检测实现数据集 2.4 实现代码2.5 检测效果 3 口罩佩戴检测算法评价指标3.1 准确率&#xff08;Accuracy&#xff09;3.2 精确率(Precision)和召回率(Recall)3.3 平均精…

基于K7的PXIPXIe数据处理板(Kintex-7 FMC载板)

基于PXI&PXIe总线架构的高性能数据预处理FMC 载板&#xff0c;板卡具有 1 个 FMC&#xff08;HPC&#xff09;接口&#xff0c;1 个 X8 PCIe 和1个PCI主机接口&#xff1b;板卡采用 Xilinx 的高性能 Kintex-7 系列 FPGA 作为实时处理器&#xff0c;实现 FMC 接口数据的采集…

事务JdbcTemplate

Spring框架对JDBC进行封装&#xff0c;使用JdbcTemplate方便对数据库操作。 1.搭建模块 2.引入依赖 <dependencies><!-- spring jdba Spring持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>…

2023数据结构期中测验-2023秋-计算机+未来网络专业

这里写目录标题 选择题函数题6-1 求链式表的表长6-2 逆序数据建立链表6-3 删除单链表偶数节点6-4 求二叉树高度6-5 先序输出叶结点 选择题 2-1 下述程序段的时间复杂度为&#xff08; &#xff09; for&#xff08;i0; i<n-1; i&#xff09;for&#xff08;j0; j<n-1-i…