数据结构OJ题——top-k问题:最小的K个数(Java实现)

题目链接:top-k问题:最小的K个数

top-k问题:最小的K个数假

  • 1.方法一
  • 2.方法二
    • 时间复杂度
  • 3.方法三
    • 时间复杂度

1.方法一

各种排序算法(由于本文主要讲有关堆的使用,这里不做有关排序算法解决本题的介绍。对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决

2.方法二

记录数组arr[]的元素个数n,用向上调整法建一个小根堆。由于用向上调整法建立小根堆后,遍历堆中的数据时,下一个元素的值一定>= 上一个元素的值。然后删除小根堆的堆顶元素k次到存储数据的数组tmp[]中,这样tmp[]中记录的就是前k个最小的数。

代码如下

class Solution {public int[] smallestK(int[] arr, int k) {PriorityQueue<Integer> heap = new PriorityQueue<>(); //n*logn  以向上插入的方法建堆for(int i = 0; i < arr.length;i++){heap.offer(arr[i]);}//k*logn   删除堆顶的K个元素到目标数组中int[] tmp = new int[k];//创建数组tmp[]存储前k个最小数据for(int i = 0;i < k;i++){tmp[i] = heap.poll();}return tmp;}
}

时间复杂度

以向上调整法建堆的过程中时间复杂度为T1(n) = (n+1)*( log2(n+1) - 2) + 2,删除堆顶k个元素的时间复杂度为T2(n) = k*log2( n+1 ),因此总的时间复杂度为:T(n)= (n+k+1) * log2(n+1);

3.方法三

思考:arr[]数组中有n个元素,我们只需要取出前k个最小的元素。在方法二中,我们建立了一个大小为n的小根堆。考虑到我们最终只需要保留k个数据,我们能否建立一个大小为k的堆,在这个堆上对数据进行操控从而降低程序的时间复杂度呢?答案是肯定的。

图示如下
在这里插入图片描述
代码如下

//实现comparator接口,为了创立比较器
class Imp implements Comparator<Integer>{public int compare(Integer o1,Integer o2){return o2.compareTo(o1);    //注意,创建大根堆,必须o2在前o1在后}
}
class Solution {public int[] smallestK(int[] arr, int k) {int[] tmp = new int[k];if(k == 0){//k==0 单独处理,防止空指针异常return tmp;}Imp imp = new Imp();PriorityQueue<Integer> maxHeap = new PriorityQueue<>(imp);//建立一个大小为3的大根堆for(int i = 0;i < k;i++){maxHeap.offer(arr[i]);} for(int i = k;i < arr.length;i++){//arr[i]比堆顶元素小if(arr[i] < maxHeap.peek()){maxHeap.poll();maxHeap.offer(arr[i]);}}for(int i = 0;i < k;i++){tmp[i] = maxHeap.poll();}return tmp;}
}

时间复杂度

建堆过程:T1(n) = k*log2(k + 1)

 for(int i = 0;i < k;i++){maxHeap.offer(arr[i]);} 

删除添加元素过程:T2(n) = (n-k) * log2(k + 1);

for(int i = k;i < arr.length;i++){//arr[i]比堆顶元素小if(arr[i] < maxHeap.peek()){maxHeap.poll();maxHeap.offer(arr[i]);}}

所以总的时间复杂度T(n) = n*log2(k+1)-----(1)
对比方法二的时间复杂度T(n)= (n+k+1) * log2(n+1) -----(2)
(1)式的值更小,特别当n是一个极大的数比如100000,而k只是一个就很小的数比如10时,两个式子在对数真数部分的差值巨大,(1)式的值远小于(2)式。
当然方法二也有比较麻烦的地方,在于它需要创建一个大根堆,而Java默认创建的是小根堆,因此需要一个类实现Comparator接口并重写里面的compare()方法。这部分内容我会在其他文章做介绍,这里由于不是本文的核心暂时就忽略掉了。

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

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

相关文章

linux(阿里云)安装pytorch

目录 环境 安装步骤 1 检查python3和pip3是否已经安装 2 安装pytorch 3 安装完毕&#xff0c;检查pytorch版本 环境 阿里云 ubuntu 22.04 UEFI版 64位 安装步骤 1 检查python3和pip3是否已经安装 输入下面两条指令&#xff1a; python3 --version pip --version 检…

1Panel使用GMSSL+Openresty实现国密/RSA单向自适应

本文 首发于 Anyeの小站&#xff0c;转载请取得作者同意。 前言 国密算法是国家商用密码算法的简称。自2012年以来&#xff0c;国家密码管理局以《中华人民共和国密码行业标准》的方式&#xff0c;陆续公布了SM2/SM3/SM4等密码算法标准及其应用规范。其中“SM”代表“商密”&a…

ChatGPT对软件测试的影响!

ChatGPT 是一个经过预训练的 AI 语言模型&#xff0c;可以通过聊天的方式回答问题&#xff0c;或者与人闲聊。它能处理的是文本类的信息&#xff0c;输出也只能是文字。它从我们输入的信息中获取上下文&#xff0c;结合它被训练的大模型&#xff0c;进行分析总结&#xff0c;给…

【C++杂货铺】string详解

目录 1. 基本概念&#xff1a; 1.1 本质&#xff1a; 1.2 string和char*区别&#xff1a; 1.3 特点&#xff1a; 2. 构造函数(初始化) 3. 赋值操作 4. 字符串拼接 5 查找 和 替换 6. 字符串比较 7. 字符存取 8. 插入和删除 ​9. 子串获取 &#x1f308;前言&#x…

Rocky Linux网卡静态配置

一、开源系统 Rocky Linux 下载安装 1、安装教程 Rocky Linux 下载安装 二、远程工具 MobaXterm下载安装 1、安装教程 MobaXterm 下载安装 三、Rocky Linux 网卡配置 1、使用ip addr确认网卡名称&#xff08;此处可得知网卡为ens160&#xff09; [rootlocalhost ~]# ip a 1:…

【笔记】Helm-5 Chart模板指南-14 下一步

下一步 本指南旨在为chart开发者提供对如何使用Helm模板语言的强大理解能力。该模板聚焦于模板开发的技术层面。 但涉及到chart的实际日常开发时&#xff0c;很多内容本指南并没有覆盖到。这里有一些有用的文档链接帮助您创建新的chart&#xff1a; CNCF的 Artifact Hub 是ch…

23款奔驰GLE350升级小柏林音响 安装效果分享

小柏林之声音响是13个喇叭1个功放&#xff0c;功率是590W&#xff0c;对应普通音响来说&#xff0c;已经是上等了。像著名的哈曼卡顿音响&#xff0c;还是丹拿音响&#xff0c;或者是BOSE音响&#xff0c;论地位&#xff0c;论音质柏林之声也是名列前茅。星骏汇小许Xjh15863 升…

2.C语言——输入输出

1.字符输入输出函数 1.输入:getchar() 字面意思&#xff0c;接收单个字符&#xff0c;使用方法 char a; a getchar();实际上效果等同于char a; scanf("%c",&a);2.输出:putchar() 2.格式化输入输出函数 1.输入:scanf() 格式&#xff1a; scanf(“格式控制…

【SpringBoot5】SpringBoot如何找到我们写的类的

目录 1.Spring如何加载我们的类的 2.Spring注解驱动发展史与核心注解介绍 2.1 Spring驱动发展简史 2.2 @Configuration和@Bean注解 2.3 @Import以及相关注解 3.看看SpringBoot的启动的入口 3.1 @SpringBootConfiguration注解 3.2 @EnableAutoConfiguration注解 4.SpringBo…

Axes属性汇总

Axes属性很多&#xff0c;主要起控制坐标区的外观和行为的作用&#xff0c;共涉及十三类。 第1类&#xff1a;字体 Font Name——字体名称&#xff0c;默认为’Helvetica’。 要使用在任何区域设置中都有较好显示效果的等宽字体&#xff0c;请使用 “FixedWidth”。等宽字体依…

C语言KR圣经笔记 7.5文件访问 7.6错误处理-stderr和exit

7.5 文件访问 到目前为止&#xff0c;给出的例子都是读标准输入和写标准输出&#xff0c;而标准输入和输出都是由本地操作系统自动为程序定义的。 下一步是写个程序来访问还没有被连接到程序上的文件。我们以一个叫做 cat 的程序来说明这种操作需求&#xff0c;它连接一系列指…

系统测试计划(直接套用实际)

1测试目的 2测试范围 3资源要求 3.1人力资源 3.2指派干系人 3.3测试环境 3.4测试工具 4测试类型 5测试安排 5.1测试进度 5.2测试策略 5.2.1测试需求 5.2.2测试类型 6测试停止标准 7测试风险 8缺陷管理 8.1缺陷属性 8.2缺陷类型 8.3缺陷严重程度 8.4缺陷优先级 8.5缺陷状态 8.6缺…

【Java万花筒】跨越云平台的无服务器开发:使用Java构建弹性、高效的应用

无服务器计算平台的Java集成指南&#xff1a;AWS Lambda、Google Cloud Functions、腾讯云函数和IBM Cloud Functions 前言 无服务器计算平台提供了一种方便、弹性和成本效益高的方式来运行代码&#xff0c;而无需关心底层基础设施的管理。在这篇文章中&#xff0c;我们将探讨…

C#上位机与三菱PLC的通信07--使用第3方通讯库读写数据

1、通讯库介绍 mcprotocol 是一个基于 Node.js 的三菱 PLC MC 协议通信库&#xff0c;具有以下特点&#xff1a; 支持多种三菱 PLC MC 协议的设备&#xff0c;如 FX3U、Q03UDECPU、QJ71E71 等。 支持多种功能码和数据类型&#xff0c;如读取线圈&#xff08;M&#xff09;、…

[AIGC] 利用 chatgpt 深入理解 Java 虚拟机(JVM)

Java 虚拟机&#xff08;JVM&#xff09;是 Java 编程语言的核心运行环境&#xff0c;它负责解释和执行 Java 字节码。它是 Java 程序能够跨平台运行的关键&#xff0c;因为不同的操作系统和硬件平台都有自己的指令集和体系结构&#xff0c;而 JVM 则提供了一个统一的运行环境&…

C#面:列举ASP.NET页面之间传递值的几种方式

查询字符串&#xff08;Query String&#xff09;&#xff1a; 可以通过在URL中添加参数来传递值。 例如&#xff1a;http://example.com/page.aspx?id123 在接收页面中可以通过Request.QueryString[“id”]来获取传递的值。 会话状态&#xff08;Session State&#xff0…

com.google.android.material.tabs.TabLayout

一、布局 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"a…

P13 进制

进制本质&#xff0c;每一个数位上的数字乘上这一位的权重 再计算机中&#xff0c;数字均通过二进制补码表示 #include <bits/stdc.h> using namespace std; using ll long long; const int N 50; int a[N] ; int main() {string s "2021ABCD";for(int i…

LeetCode 每日一题 2024/2/12-2024/2/18

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 2/12 145. 二叉树的后序遍历2/13 987. 二叉树的垂序遍历2/14 102. 二叉树的层序遍历2/15 107. 二叉树的层序遍历 II2/16 103. 二叉树的锯齿形层序遍历2/17 429. N 叉树的层…

硬核!10分钟教你搭建一个本地版GPT4.0!

今天10分钟手把手教会你在自己电脑上搭建一个官方原版的GPT4.0。 不用ChatGPT账号&#xff0c;不用API&#xff0c;直接免费使用上官方原版的GPT4.0&#xff01; 对&#xff01;你没看错&#xff01;不仅是正版GPT4.0&#xff0c;还完全免费&#xff01; 而且整个部署流程极其简…