TopK问题

前言:本篇对TopK问题的解答是介于堆的基础上讲的

TopK问题:

就是在许多数据中找到前K个最大的数据或者最小的数据

比如:专业前10、世界五百强、富豪榜、以及游戏排行榜等等

对于TopK问题:能想到的最简单直接的方式就是排序解决,通常包括排序、堆排序、快速选择等排序算法,但是如果数据量太大了,排序就不太可能了(可能数据都不能一下子全部加载到内存中),用到堆排序的方法能够大大减少计算时间和内存需求,反而能得到很高的效率


怎么做?

最开始第一想法肯定是,将所有数据建立成K个堆,然后将K堆的堆顶元素Top(取)出来,得到的就是每个堆的最大/最小的元素,但是呢?这样的话,需要的空间还是挺大的,那么有没有其他办法能够做到,占用少量的空间,完成巨大的任务量呢??

尝试着以K个元素只建一个堆,空间减小了很多,由堆的性质,这个问题好像就迎刃而解了!我们将后n-k个数全部比较,每放进去一个元素又调整成堆,也就是每次堆顶元素都是最小值,堆顶元素(最小值)找到比他大的就会被Pop掉,当后N-K个元素比较完后,最后留在堆里的不就是最大的K个数么

 来实现一下10个最大的元素,这里我们用到rand函数和srand以及time生成随机数,即将伪随机变成随机来创建一些数据来进行,当然为了验证,自己可以在最后的数据加10个最大数据,验证即可;这里建堆用的向下排序建堆,因为相比于向上排序建堆,时间复杂度更低

#define _CRT_SECURE_NO_WARNINGS 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//交换函数
void Swp(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
//打印:
void INPrin(int* a,int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}}
//向下调整:小堆
void AdjustDownSmall(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){//假设法:谁小,小的孩子往上走//因为会有孩子没有兄弟if (a[child] > a[child + 1] && child + 1 < n){child = child + 1;}if (a[child] < a[parent]){Swp(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void createndate()
{//造数据:int n = 10000;//设置种子:随机数srand((unsigned int)time(NULL));//以写的形式打开文件;FILE* fp = fopen("data.txt", "w");if (fp ==NULL){perror("fopen");return;}//数据个数:for (int i = 0; i < n; i++){//生产0-10000的随机数int ret = (rand()+i) % n;fprintf(fp, "%d\n", ret);}//验证for (int j = 3*n; j < 3*n + 11; j++){fprintf(fp, "%d\n", j);}fclose(fp);fp = NULL;
}
//top-k问题:得到最大的k个数
void printtopk(int k)
{//打开文件(读)FILE* fp = fopen("data.txt", "r");if (fp == NULL){perror("fopen");return;}int* a = (int*)malloc(sizeof(int) * k);if (a == NULL){perror("malloc");return;}//int i;for (i = 0; i < k; i++){fscanf(fp, "%d", &a[i]);}//前k个建小堆:(向下调整)时间复杂度为:o(n)for (i = (k - 1 - 1) / 2; i > 0; i--){AdjustDownSmall(a, k, i);}int x = 0;while (fscanf(fp, "%d", &x) >0){//进行比较并xiangxia调整if (a[0] < x){a[0] = x;AdjustDownSmall(a, k, 0);}}INPrin(a, k);
}int main()
{//createndate();printtopk(10);return 0;
}

 当然结果并非有序的,想让它有序其实就是堆排序的操作,对这10个元素,不断取栈顶元素,放到数组就能排序好

 x感谢观看,下次见

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

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

相关文章

fastadmin二次开发 修改默认的前端弹出样式

需要修改fastadmin后台默认的弹出提示样式效果&#xff1a; 在项目里搜索这个关键词&#xff1a;Toastr 首先这个文件&#xff0c;里面的success和error就是弹出提示的方法。 public/assets/js/fast.js 然后是下面这个文件&#xff1a; public/assets/js/require-form.js 你…

对于高速信号完整性,一块聊聊啊(13)

前面一篇说了有源仿真和无源仿真的区别&#xff0c;今天介绍一下前仿真和后仿真。 一个完整的电路设计中必然包含前仿真和后仿真两个部分&#xff0c;它们都属于验证的必要环节。 尤其是在复杂的芯片设计中&#xff0c;验证要占用整个芯片设计流程时间的60%-70%。目的就是尽可…

快速搭建uni-app项目,vue2、Vue3与图鸟UI组件封装

大家好&#xff0c;我们团队近期在uni-app开发领域取得了重要突破&#xff0c;特地向大家介绍一系列基于Vue 2、Vue 3和图鸟UI的封装组件&#xff0c;以及ucharts图表的封装。这些成果旨在帮助开发者们更加高效、便捷地构建uni-app项目。 一、Vue 2、Vue 3与图鸟UI封装组件 为…

解析气膜场馆造价—轻空间

随着社会的发展和对环保及时间成本的重视&#xff0c;气膜场馆逐渐成为众多体育场馆的首选建筑模式。气膜建筑包括气膜篮球场、气膜室内足球场、气膜羽毛球场、气膜乒乓球馆、气膜网球场以及气膜滑冰场等&#xff0c;因其多项优势受到广泛应用。 气膜场馆的显著特点 1. 气膜场馆…

H5 静默获取微信code

https://open.weixin.qq.com/connect/oauth2/authorize?appid*******&redirect_uri******&response_typecode&scopesnsapi_base&stateSTATE#wechat_redirect

基于springboot+vue2+mysql,不能添加重复数据的实现

1.后端代码的实现&#xff1a; 1.1controller层 PostMapping("/save")public ResultData saveNotice(RequestAttribute Long _userId,RequestBody OperationMaintenance operationMaintenance ) throws IOException {try {operationMaintenanceService.saveData(_u…

aosp14的分屏接口ISplitScreen接口获取方式更新-学员疑问答疑

背景&#xff1a; 有学员朋友在学习马哥的分屏pip自由窗口专题时候&#xff0c;做相关分屏做小桌面项目时候&#xff0c;因为原来课程版本是基于android 13进行的讲解的&#xff0c;但是现在公司已经开始逐渐进行相关的android 14的适配了&#xff0c;但是android 14这块相比a…

探索微软的edge

微软的Edge浏览器是一款由微软开发的网络浏览器&#xff0c;最初基于EdgeHTML布局引擎&#xff0c;后来转向了Chromium开源项目&#xff0c;成为基于Chromium的浏览器。以下是一些探索微软Edge浏览器的关键点&#xff1a; 1. 下载和安装 访问微软官方网站下载最新版本的Edge浏…

进口铝合金隔膜泵的性能

进口铝合金隔膜泵的性能特点主要体现在以下几个方面&#xff1a; 材质与结构&#xff1a; 材质&#xff1a;采用铝合金材料制造&#xff0c;具有良好的耐腐蚀性和轻量化特点&#xff0c;使得泵体结构紧凑、轻便&#xff0c;便于移动和安装。结构&#xff1a;泵体设计紧凑&…

Redis对象存储的类型

基本概念 Redis是一个基于内存中的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。Redis支持五种常见的对象类型&#xff1a; 字符串&#xff08;String&#xff09;哈希&#xff08;Hash&#xff09;列表&#xff08;List&#xff09;集合&#xff08;Set&…

2024年上半年系统架构设计师——案例第二题——UML相关

这个只记到一个大概了 主题干&#xff0c;说明人员访客系统 题目1 9分 问序列图信息类型和特点 题目2 序列图填空 好像是10分吧 访客系统的序列图 题目3 6分 说明软件分析和设计时的和UML图有关原则&#xff1f;

Cocos Creator 2D物理引擎的使用详解

前言 Cocos Creator是一款优秀的游戏开发工具&#xff0c;它提供了强大的2D物理引擎&#xff0c;帮助开发者轻松实现游戏中的物理效果。在本文中&#xff0c;我们将详细介绍Cocos Creator中2D物理引擎的使用方法&#xff0c;并通过代码实现来演示其具体应用。 对惹&#xff0…

展厅设计要做好需要考虑哪些要素

1、展示主题 企业展厅要有一个明朗的展示主题&#xff0c;不止是为了为展厅设计提供方向&#xff0c;也是为了让参观者更好地了解和认识企业。通过精心策划的展示主题&#xff0c;打造一个富有情感和故事性的展示空间&#xff0c;可以快速感染到参观者&#xff0c;使其能够在参…

Go使用结构体实现类(面向对象)

前置 package main ​ import ("fmt" ) ​ // 矩形结构体 type Rectangle struct {Length intWidth int } ​ // 计算矩形面积 func (r *Rectangle) Area() int {return r.Length * r.Width } ​ func main() {r : Rectangle{4, 2}// 调用 Area() 方法&#xff0c;计…

代码随想录-算法训练营day52【动态规划13:最长递增子序列、最长连续递增序列、最长重复子数组】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part13● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组 详细布置 300.最长递增子序列 今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。 视频…

Git与Maven的使用

1. Git git是版本控制工具&#xff0c;gitee和github是基于git的代码托管仓库。 1.1 常用命令 类型描述命令全局配置设置用户名git config --user.name 用户名设置用户邮箱git config --user.email 邮箱地址基本命令[本地命令]初始化本地仓库git init查看仓库状态git status添…

幼儿园管理系统-收退费管理原型模版

幼儿园管理系统是专为幼儿园打造&#xff0c;涵盖学校儿童、职工人事、收费财务、后勤管理、办公教务、膳食分析、体检保健、文档管理等各方面内部管理的幼儿园专家系统。 本次分享给大家的是雅居乐教育集团幼儿园园务管理系统中“收退费管理”模块的设计文档。收退费管理是幼儿…

CSP化学方程式配平(简单易懂)

100分代码&#xff1a; check()&#xff1a;检查每个字符串中元素及其数量 did(int i , int x , int y)&#xff1a;将第 i 行的第 y 个数前都是0&#xff0c;第 y 个数开始不是0&#xff0c;根据第 x 行将第 i 行第 y 个数开始的数变成0 map<string , int>mp &#xff…

leetcode打卡#day30 93. 复原 IP 地址、78. 子集、 90. 子集 II

93. 复原 IP 地址 class Solution { private:vector<string> result;//判断Ip字段是否合法bool isValid(string& s, int startIndex, int endIndex) {if (startIndex > endIndex) return false;//以0开头 -- 无效数字if (s[startIndex] 0 && startIndex…

代码+视频,总结R语言常用的几种按条件转换数据的方法

在科学研究中免不了和数据打交道&#xff0c;收集到原始数据后我们经常需要对其进行清洗、转换才能得到我们需要的数据。 今天我总结了一下自己常用的一些多条件的数据转换方法&#xff0c;在临床中遇到问题能多一种选择&#xff0c;下面视频操作演示一下 总结R语言常用的几种按…