TOP-K

article/2025/11/5 10:27:09

目录

TOP-K介绍

TOP-K实现

源码


TOP-K介绍

什么是TOP-K? 贴近生活来说,点外卖,打游戏。比如某团,你点一个美食,选你选在城市后,你选择按评分排序,那么它会将这个城市里所有美食店铺评分最高的依次排列;再准确点,再比如游戏内的国标,国标就是总体数据,去排一个国家内前100熟练度最高的玩家,再给前100的玩家颁发国标

这就是TOP-K问题 在一个大数据中(这个大数据通常非常大,我们在这个大数据中选取前10,前100的数据。


TOP-K实现思路

那么我们用的方法是用堆来实现,

1.先建一个仓库,这个仓库是按从小到大的顺序来排的,仓库最上方最小的(叫做仓顶)

2.我们去遍历这个大数据,如果大数据中有比这个仓顶大的,那么我们就把大数据中这个数放入仓顶。

3.放入后,我们重新排列仓库,永远保存仓库是从小到大的顺序来排的,仓顶永远是仓库中最小的数字

4.等我们遍历完这个大数据,那么仓库中就是大数据中前K个最大的数

那么我们把仓库换成堆试试

比如仓库的从小到大的顺序,就比作小堆,小堆的堆顶就是堆中最小的数。

那么思路有了,就可以思路转代码了


TOP-K实现

首先我们定义出这个大数据中有多少个数,然后申请出这个空间,利用随机数,再这个空间中放慢随机值,

(因为我们需要准确性,所以特意在数据中一些地方放入较大的值,如果结果是这些较大的值,那么说明我们排序成功)

这时候就开始实现TOP-K

按照前面的思路,我们先申请出一个空间,即仓库(堆)

把大数据中前K个值放入堆中(这里大数据的值都是随机的)

 

 然后建小堆

 依次去遍历大数据跟堆顶比较,如果大于,就放入堆,并且重新建堆,让堆顶保持是堆中最小

(依次反复,大数据中前K个大的数全在堆中)

最后我们打印堆中的数据(数据可能不是有序的,因为是堆,如果你想要有序,可以对堆进行排序)

 

 

源码

void TopK(int* a, int size, int k)
{int* TopKsort = (int*)malloc(sizeof(int)*k);for (int i = 0; i < k; i++){TopKsort[i] = a[i];}//建K的小堆for (int i = (k-1-1)/2; i>=0; --i){ADjustDown(TopKsort, k, i);}//依次遍历Size-K个数 如果比K大就入堆for (int i = k; i < size; i++){if (a[i] > TopKsort[0]){TopKsort[0] = a[i];ADjustDown(TopKsort, k, 0);}}for (int i = 0; i < k; i++){printf("%d ", TopKsort[i]);}
}
int main()
{int n = 10000;int* a = (int*)malloc(sizeof(int)*n);srand(time(0));for (size_t i = 0; i < n; i++){a[i] = rand() % 1000000;}a[4342] = 1000000 + 1;a[4343] = 1000000 + 9;a[4354] = 1000000 + 2;a[4339] = 1000000 + 4;a[436] = 1000000 + 3;a[4332] = 1000000 + 5;a[4330] = 1000000 + 7;a[4337] = 1000000 + 6;a[4336] = 1000000 + 10;a[43] = 1000000 + 8;TopK(a, n, 10);return 0;
}

http://chatgpt.dhexx.cn/article/TeaILSug.shtml

相关文章

AIX系统 topas查看系统各项指标性能

AIX系统 topas查看系统各项指标性能 topas命令默认2秒更新一次 一、topas命令以区域形式表现系统各项指标性能 如下图&#xff1a; 1、 CPU&#xff1a;反应CPU性能区域&#xff0c;如果有多个 CPU&#xff0c;按 c 键两次就可显示 CPU 列表。仅按 c 键一次会关闭此区域 Us…

top 与 htop

top 与 htop 区别 一、相同点 两者均是可以查看cpu使用情况的命令 二、不同点 top 在linux系统中&#xff0c;top 命令用来显示系统中正在运行的进程的实时状态&#xff0c;它显示了一些非常有用的信息&#xff0c;比如 CPU 利用情况、内存消耗情况&#xff0c;以及每个进…

top cpu

我们有时会把%CPU和us%搞晕&#xff0c;也就是下图所示在top的时候查看cpu的信息。 这时有人会问&#xff1a;这两个CPU到底哪个是对的。 其实都是对的&#xff0c;只是表达的意思不一样。 官方解释如下 Cpu(s)&#xff1a;34.0% us: 用户空间占用CPU百分比 %CPU&#xff1…

TOP TOPAS

在IBM的OS AIX中,root用户输入topas可以查看系统的运行情况(有的OS是使用top查看),如图: (此图截于IBM eServer p5 590)Kernel:内存使用百分率 Network:网络信息区User: 用户进程使用百分率 Disk: 存储信息区Wait: …

安装TOPAS RTion extension, 出现的问题及解决方法

TOPAS MC上有安装general extension的教程&#xff0c;在To add User Extensions部分中。GitHub dicom-interface的readme应该是由于长时间没有更新&#xff0c;所以有些错误。本文是在Linux系统下安装RTion extension&#xff0c;其他系统应该也能借鉴。计算机小白&#xff0c…

TOPAS详解

原文出处&#xff1a;http://www.blogjava.net/freeman1984/archive/2011/12/08/365848.html 上一张我们测试机的topas的图(aix 5.3)&#xff1a;然后后面附上解释&#xff1a; topas命令用于监控各种系统资源&#xff0c;如CPU的使用情况&#xff0c;CPU事件和队列&#xff0…

AIX之topas命令详解

AIX基本命令topas简介 Posted on 2015 年 11 月 11 日 by xiaoyu 由于最近工作需要涉及到AIX主机、存储层面&#xff0c;就对这方面的内容做个简要的笔记&#xff0c;以供后续参考。 topas命令利用System Performance Measurement Interface&#xff08;SPMI) API获得有关信…

AIX topas命令详解

topas命令默认2秒更新一次 一、topas命令以区域形式表现系统各项指标性能&#xff0c; 如下图&#xff1a; 1、 CPU&#xff1a;反应CPU性能区域&#xff0c;如果有多个 CPU&#xff0c;按 c 键两次就可显示 CPU 列表。仅按 c 键一次会关闭此区域 User%&#xff1a;用户进程占…

Topas——基于Geant4的放射治疗蒙特卡罗算法模拟工具

Topas——基于Geant4的放射治疗蒙特卡罗算法模拟工具 关于Topas学习前提 安装Topas获取topas.tar.gz获取方法一获取方法二 配置unix环境安装Topas安装Geant4设置Geant4环境 使用Topas一个简单的 HelloWorld 程序 OneBox.txtTopas中txt参数文件的编写规则&#xff08;1&#xff…

java给时间设置格式化_java怎样给时间格式化

java怎样给时间格式化 【提要】本篇《java如何给时间格式化》特别为需要格式编程学习的朋友收集整理的&#xff0c;仅供参考。内容如下&#xff1a; java中如何格式化的时间&#xff0c;这是一个很简单的问题&#xff0c;在实际的编程中经常用&#xff0c;以下是小编为大家搜索…

Java时间格式化与解析

Java中自带的类库是十分强大的&#xff0c;今天来介绍一个时间的格式化与解析的功能以及用法&#xff0c;说明时间的格式化和解析就离不开一个类&#xff1a;SimpleDateFormat这个类&#xff0c;这类中有两个比较重要的方法&#xff0c;也是这次主要用到的方法parse方法和forma…

Java格式化日期 微秒

Java格式化日期 微秒 Date、LocalDateTime格式化微秒值Date、LocalDateTime互转 本文主要讲述Java日期格式化及格式化日期到微秒 Date、LocalDateTime格式化微秒值 java代码TestTime.java如下 package com.dongao.test;import com.dongao.project.common.util.DateUtils;impo…

java日期格式_java日期和时间的格式化

在编写程序时,经常需要对日期进行格式化输出。使用String类的format方法可以实现对日期和时间的格式化输出。 日期的格式化输出 Java提供了日期格式化转换符用于支持日期的格式化输出,格式化转换符如下表所示: 案例1:使用API库的Date类获取当前日期和时间信息,并用format(…

java时间格式化函数

时间格式化类位于java.text下 DateFormat和SimpleDateFormat是用来格式化一个日期的&#xff0c;不是用来生成一个日期的 如果要生成一个日期可以用Date类或者Calendar类 DateFormate类 是日期/时间格式化子类的抽象类&#xff0c;它以语言无关的方式格式化和分析日期或时间。…

JAVA 日期格式化

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 最近项目中需要用到SimpleDateFormat 格式化日期&#xff0c;但是因为对日期格式的不熟练多花了十分钟左右的时间在日期格式化上面&#…

Java格式化日期,时间(三种方法,建议收藏)

1.String.format() 在java中String类格式化的方法&#xff0c;是静态format()用于创建格式化的字符串。 format(String format, Object... args) 新字符串使用本地语言环境&#xff0c;制定字符串格式和参数生成格式化的新字符串。 format(Locale locale, String format, Ob…

Linux开发工具使用

文章目录 Linux编译器-gcc/g使用背景知识gcc如何完成预处理(进行宏替换)编译&#xff08;生成汇编&#xff09;汇编&#xff08;生成机器可识别代码&#xff09;链接&#xff08;生成可执行文件或库文件&#xff09;函数库静态函数库与动态函数库gcc选项 Linux调试器-gdb使用背…

linux c 开发

在很多人的眼里&#xff0c;C语言和linux常常是分不开的。这其中的原因很多&#xff0c;其中最重要的一部分我认为是linux本身就是C语言的杰出作品。当然&#xff0c;linux操作系统本身对C语言的支持也是相当到位的。作为一个真正的程序员来说&#xff0c;如果没有在linux下面用…

Linux开发工具的使用

Linux开发工具&#x1f36c; 目录 Linux开发工具&#x1f36c;&#x1f4bb; Linux安装软件&#x1f4bb;&#x1f4bb; Linux软件包管理器 yum &#x1f4bb;&#x1f4bb;Linux编辑器-vim的使用&#x1f4bb;普通模式 &#x1f4d6;末行模式&#x1f4d6;vim配置&#x1f4d6…

Linux入门开发

/*************************************************/ /* 本贴记录自己项目开发过程中遇到的一些问题&#xff0c;水平一般&#xff0c;有错误或者不足欢迎指正&#xff0c;感谢&#xff01;*/ 一、Linux基础 1.1 linux常用命令 top命令 linux的top命令相当于windows…