【数据结构】使用堆实现 求最小K个数

news2024/11/23 13:10:26

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!

首先我们会想到,通过建立小根堆,使堆顶元素为数组中的最小元素;

然后使堆顶元素出堆,循环K次;

 public int[] smallestK2(int[] arr, int k){
        int[] tmp = new int[k];
        if(k == 0){
            return tmp;
        }
        PriorityQueue<Integer> minHeap = new PriorityQueue();
        for (int i = 0; i < arr.length; i++) {
            minHeap.push(arr[i]);
//O(n * logn)
        }
        for (int i = 0; i < k; i++) {
            tmp[i] = minHeap.pollHeap();
//O(k * logn)
        }
        return tmp;
    }

但该解法只是PriorityQueue的简单使用,并不是topK最好的做法;

这个算法的时间复杂度可以分为几个部分来看:

  1. 将数组元素插入优先队列(最小堆)的时间复杂度为 O(n * log(n)),其中 n 为数组的长度 arr.length。
  2. 从优先队列中弹出 k 个最小元素的时间复杂度为 O(k * log(n)),因为每次弹出最小元素的操作的时间复杂度是 O(log(n))。

因此,总的时间复杂度为 O(n * log(n) + k * log(n))。如果 k 远小于 n,那么算法的时间复杂度可以近似为 O(n * log(n))。并不是最理想的方法;


我们可以先将数组前K个元素建立大根堆(没错,是大根堆!),再接着遍历剩下N-K个元素;

如果当前堆顶的元素大于遍历的数组元素,则说明堆顶元素不是前K个最小元素之一;

此时将堆顶元素出堆,遍历到的数组元素入堆,最终堆中就是要求的前K个最小元素;

class IntCmp implements Comparator<Integer> {

    @Override
    public int compare(Integer o1, Integer o2) {
        return o2.compareTo(o1);
    }
//此接口将默认的建立小根堆改为建立大根堆;
}

public class PriorityQueue {

    public int[] smallestK1(int[] arr, int k) {
        int[] tmp = new int[k];
        if(k == 0){
            return tmp;
        }
        PriorityQueue<Integer> minHeap = new PriorityQueue<>(new IntCmp());
        //1.把前k个元素放进堆中;
        for (int i = 0; i < k; i++) {
            minHeap.push(arr[i]);
        }
        //2.遍历剩下N - K个元素;
        for (int i = k; i < arr.length; i++) {
            int val = minHeap.peekHeap();
            if(val > arr[i]){
                minHeap.pollHeap();
                minHeap.push(arr[i]);
            }
        }
        //3.将遍历好的大堆放入数组,此时数组都是为最小元素;
        for (int i = 0; i < k; i++) {
            tmp[i] = minHeap.pollHeap();
        }
        return tmp;
    }

这个算法的实践复杂度可以通过对每个步骤的操作进行分析得出:

  1. 将前 k 个元素放入最小堆中的操作需要 O(k * log(k)) 的时间,因为每次插入元素的时间复杂度为 O(log(k))。
  2. 遍历剩下的 N - K 个元素并进行堆的调整,最坏情况下需要遍历 N - K 个元素,并在每个元素需要更新堆时执行插入和弹出操作,每个操作的时间复杂度均为 O(log(k))。因此,遍历和调整的总时间复杂度为 O((N - K) * log(k))。
  3. 最后将堆中的元素放入数组中的操作需要 O(k * log(k)) 的时间。

因此,整个算法的时间复杂度为 O((N - K) * log(k) + k * log(k)),其中 N 为数组的长度 arr.length,k 为要求的最小元素个数。如果 k 远小于 n,那么算法的时间复杂度可以近似为 O((N-K) * log(K))。较前一种方法来看更为理想。


希望这篇博客能为你理解java编程思想提供一些帮助。

如有不足之处请多多指出。

我是高耳机。 

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

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

相关文章

Error: [WinError 2] 系統找不到指定的檔案

背景及相关说明 由于工作的需要&#xff0c;自己电脑上是多python版本环境&#xff0c;分别是python3.6.8&#xff0c;python3.8.8&#xff0c;python3.9.2&#xff0c;默认的环境是python3.6.8&#xff0c;现在想要安装一下paddleocr进行文字识别&#xff0c;然后打算使用创建…

Docker 容器 mysql 配置主从

1、前提条件 集群的条件下 服务器 172.16.11.195 13316:3306 服务器 172.16.11.196 13317:3306 配置好主数据库和从数据 2、配置主从数据库 2.1使用portainer 来管理容器 建立数据库密码 新增配置文件 # mysql-master.cnf [mysqld] server_id110 log-binmysql-binrela…

2024/6/7 英语每日一段

A recent review study examining a decade of research on technology and sleep found the link is more nuanced than previously thought. “It’s an interaction between a person’s vulnerabilities--and not everyone has these vulnerabilities--and the type of act…

公寓远程抄表系统:智能管理方法新的篇章

1.界定和功能 公寓远程抄表系统是一种前沿的自动化控制&#xff0c;它允许物业管理管理人员在远离现场部位收集和分析公寓里的电力能源使用数据&#xff0c;似水、电、气等。根据集成传感器、物联网产品和云计算&#xff0c;系统能实时检测并记录公寓的能耗状况&#xff0c;大…

Linux C语言:字符数组和字符串

一、字符数组 1、定义 字符数组是元素的数据类型为字符类型的数组 √ char c[10]; √ char ch[3][4]; 2、 字符数组初始化 字符数组的初始化 &#xff1a;√ 逐个字符赋值 3、字符串 C语言中无字符串变量&#xff0c;一般用字符数组处理字符串字符串结束标志&#xff1a…

mysql 数据库datetime 类型,转换为DO里面的long类型后,只剩下年了,没有了月和日

解决方法也简单: 自定义个一个 Date2LongTypeHandler <resultMap id="BeanResult" type="XXXX.XXXXDO"><result column="gmt_create" property="gmtCreate" jdbcType="DATE" javaType="java.lang.Long"…

ts类型声明文件、内置声明文件

1. ts类型声明文件 在ts中以d.ts为后缀的文件就是类型声明文件&#xff0c;主要作用是为js模块提供类型信息支持&#xff0c;从而获得类型提示 1.1 第三方包用ts编写的&#xff0c;会自动生成一个 .d.ts文件&#xff0c;进行类型声明 1.2 有些包不是用ts编写的&#xff0c;在…

Type-C PD芯片,带充电的OTG转接器方案 LDR6500

随着现代社会生活水平的飞速提升&#xff0c;人们的电子设备日益丰富多样。从智能手机、平板电脑到笔记本电脑、智能手表&#xff0c;再到无线耳机、游戏主机如任天堂Switch、索尼PS5等&#xff0c;这些电子设备已经成为了我们生活中不可或缺的一部分。然而&#xff0c;这些设备…

verilog阻塞和非阻塞语法

阻塞和非阻塞是FPGA硬件编程中需要了解的一个概念,绝大部分时候,因为非阻塞的方式更加符合时序逻辑设计的思想,有利于时钟和信号的同步,更加有利于时序收敛,所以除非特殊情况,尽量采用非阻塞方式。 1,非阻塞代码 非阻塞赋值,A和B是同时被赋值的,具体是说在时钟的上升…

mac安装nigix且配置 vue/springboot项目(本地/服务器)

一、mac安装Nigix 1. 查看是否存在 nginx 执行brew search nginx 命令查询要安装的软件是否存在 brew search nginx 2. 安装nginx brew install nginx 3. 查看版本 nginx -v 4. 查看信息 查看ngxin下载的位置以及nginx配置文件存放路径等信息 brew info nginx 下载的存…

鸿蒙OS流转之跨端迁移

前言 流转在HarmonyOS中泛指多设备分布式操作&#xff0c;也是HarmonyOS的亮点之一。流转按体验可以分为跨端迁移和多端协同&#xff0c;这里主要跟大家讲一下如何进行跨端迁移&#xff0c;以及我在项目开发过程中&#xff0c;所遇到的问题与解决方法。 开发步骤 在开发过程…

剪画小程序:图片去除文字,我用它只要10秒!

Hello&#xff0c;大家好呀&#xff01;我是不会画画的小画~ 图片上的文字该如何去除&#xff1f; 在工作或者学习中&#xff0c;我们常常需要处理一些图片文件&#xff0c;比如扫描的文件、 电子文档等。有时候&#xff0c;图片上可能会有文字&#xff0c;这时候需要将图片…

源码!源码!商城源码!如何选择

选择合适的商城源码是电商平台成功运营的关键因素之一。下面将从多个维度分析如何选择适合的商城源码&#xff1a; 安全性与稳定性 安全机制&#xff1a;安全的商城源码能保护用户数据和交易安全&#xff0c;避免信息泄露和被黑风险。 稳定运行&#xff1a;稳定的商城系统可以…

JAVA-LeetCode 热题-第24题:两两交换链表中的节点

思路&#xff1a; 定义三个指针&#xff0c;其中一个临时指针&#xff0c;进行交换两个节点的值&#xff0c;重新给临时指针赋值&#xff0c;移动链表 class Solution {public ListNode swapPairs(ListNode head) {ListNode pre new ListNode(0,head);ListNode temp pre;wh…

Python代码限定抽奖次数的方法

在许多应用场景中&#xff0c;抽奖活动需要限定参与次数以确保公平性和控制成本。本文将介绍如何使用Python代码实现抽奖次数的限定。我们将讨论基本的实现方法&#xff0c;并展示一个完整的代码示例。 基本思路 限定抽奖次数的基本思路是使用一个计数器来记录每个用户已经参…

linux进程间通讯指南-打通IPC大门,高效沟通无阻

在现代操作系统中&#xff0c;进程就像独立的个体&#xff0c;有时需要相互合作、数据共享&#xff0c;这就要求进程间能够高效通信。本文将为你揭开Linux进程间通信(IPC)的神秘面纱&#xff0c;探讨各种IPC工具的运作原理&#xff0c;同步机制的重要性&#xff0c;以及如何规避…

uniapp录音播放功能

ui效果如上。 播放就开始倒计时&#xff0c;并且改变播放icon&#xff0c;另外录音则停止上一次录音。 播放按钮&#xff08;三角形&#xff09;是播放功能&#xff0c;两竖是暂停播放功能。 const innerAudioContext wx.createInnerAudioContext();export default{data(){ret…

20240607给Toybrick的TB-RK3588开发板在Buildroot下适配瑞芯微7.86寸QXGATFT-LCD EDP屏幕1536x2048

20240607给Toybrick的TB-RK3588开发板在Buildroot下适配瑞芯微7.86寸QXGATFT-LCD EDP屏幕1536x2048 2024/6/7 13:59 1、背光部分&#xff1a;&backlight { pwms <&pwm2 0 25000 0>; status "okay"; }; &pwm2 { status "okay&…

计算机网络(网络原理及应用)之路由器的基本配置(详细~)

路由器的基本配置 实验目的 熟悉路由各接口的外观、接口的功能、接口的表示方法&#xff1b;掌握带外的管理方法&#xff1a;通过接口console配置&#xff1b;掌握带内的管理方法&#xff1a;通过方式telnet配置&#xff1b;掌握带内的管理方法&#xff1a;通过方式web配置&…

机器学习之数学基础(六)~时间复杂度和空间复杂度

目录 算法背景 background 1. 时间复杂度 Time Complexity 1.1 时间复杂度分类 1.1.1 O(1) 常数阶 1.1.2 O(n) 线性阶 1.1.3 O(n^2) 平方阶 1.1.4 O(logn) 对数阶 1.1.5 O(nlogn) 线性对数阶 1.1.6 O(2^n) 指数阶 1.1.7 O(n!) 阶乘阶 1.1.8 时间复杂度分类 1.2 时…