topK 问题

2024-06-04 09:36
文章标签 问题 topk

本文主要是介绍topK 问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

topK 问题

  • topK
  • 二、实验内容
  • 三、数据结构设计
  • 四、算法设计
  • 五、运行结果
  • 六、程序源码

topK

(1)实验题目
topK 问题
(2)问题描述
从大批量数据序列中寻找最大的前 k 个数据,比如从 10 万个数据中,寻找最大的前 1000 个数。请给出最大前 k 个数据的和。

二、实验内容

(1)设计求解 topK 问题的存储结构;
(2)用伪代码描述算法,并分析时空性能;
(3)编程实现。

三、数据结构设计

典型的topK问题,由于题目要求的是最大的前K个数,所以使用小根堆,堆的大小为k,首先创建堆,此时堆的大小为k ,当再次插入元素时,和栈顶元素比较,如果比堆顶元素大,把堆顶元素删除,将该元素入堆;如果比堆顶元素小,不做任何处理.把所有的数据集合遍历完,此时,小根堆中的元素就是最大的前k 个数.,然后再对这k个数求和.
堆的成员变量:
public int[] elem ;//底层结构
public int usedSize;//标记元素个数
public interface IList {
void offer(int val);//插入
int poll();//删除堆顶元素
int peek();//查看堆顶元素
}

四、算法设计

(1)堆的插入:offer(int val) :
首先将元素插入数组的尾部,usedSize++,然后向上调整.
向上调整:shiftUp()
时间复杂度:O(log2 N)
空间复杂度:O(1)
初始条件child = usedSize ; 结束条件:child = 0
每次循环让parent = (child-1)/2, 可以理解成child 的父节点
循环体:
if(elem[child] < elem[parent] ),交换child 下标和parent下标的值,然后child = parent ,parent =( child -1) /2
否则直接退出循环.
(2)堆的删除:poll(int parent ,int len)
首先将elem[0] 和elem[usedSize]交换,usedSize–,然后向下调整
向下调整:shiftDown()
时间复杂度:O(log2 N)
空间复杂度:O(1)

五、运行结果

在这里插入图片描述

六、程序源码


```java
//接口
public interface IList {void offer(int val);//插入int poll();//删除堆顶元素int peek();//查看堆顶元素
}
public class TestHeap implements IList {public int[] elem ;public int usedSize;public TestHeap(int k){this.elem = new int[k];//初始容量}//堆的插入public void offer(int val){elem[usedSize] = val;usedSize++;//向上调整shiftUp(usedSize-1);}public void shiftUp(int child){int parent =(child -1) / 2;while(child > 0){if(elem[child] < elem[parent]){swap(child ,parent);child = parent;parent = (child -1 ) / 2;}else{break;}}}//堆的删除public int poll(){int tmp = elem[0];swap(0 ,usedSize-1);usedSize--;//向下调整shiftDown(0,usedSize);return tmp;}public int peek(){return elem[0];}private void shiftDown(int parent ,int len){int child = parent *2+1;while(child < len){if(child +1 < elem.length && elem[child] > elem[child+1]){child ++;}if(elem[parent] > elem[child]){swap(parent,child);parent =child ;child = 2* parent+1;}else {break;}}}private void swap(int i,int j){int tmp = elem[i];elem[i] = elem[j];elem[j] = tmp;}}
//测试类
public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入元素个数:");int count = scanner.nextInt();System.out.println("请输入要查找的序号: ");int k = scanner.nextInt();TestHeap testHeap =new TestHeap(k);System.out.println("请输入元素结合:");int[] array = new int[count];for (int i = 0; i < count; i++) {array[i] = scanner.nextInt();}//构建元素个数为k 的小根堆for (int i = 0; i < k; i++) {testHeap.offer(array[i]);}//确保小根堆中的元素是数据集合中的最大的for (int i = k; i < array.length; i++) {int tmp = array[i];if(tmp > testHeap.peek()){testHeap.poll();testHeap.offer(tmp);}}int sum = 0;for (int i = 0; i < k; i++) {sum += testHeap.poll();}System.out.println(sum);}
}

这篇关于topK 问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029704

相关文章

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到

MySQL磁盘空间不足问题解决

《MySQL磁盘空间不足问题解决》本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录查看空间使用情况Binlog日志文件占用过多表上的索引太多导致空间不足大字段导致空间不足表空间碎片太多导致空间不足临时表空间