返回顶部
首页 > 资讯 > 后端开发 > Python >Java深入分析与解决Top-K问题
  • 344
分享到

Java深入分析与解决Top-K问题

2024-04-02 19:04:59 344人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录题目解题方案方法一方法二方法三题目 求最小的K个数 设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 解题方案 方法一 排序(冒泡/选择) 思路 1,冒泡排序

题目

求最小的K个数

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

解题方案

方法一

排序(冒泡/选择)

思路

1,冒泡排序是每执行一次,就会确定最终位置,执行K次后,就可以得到结果,时间复杂度为O(n * k),当k<<n时,O(n * k)的性能会比O(N*logN)好。

2,选择排序每执行依次,就会通过确定一个最大的或最小的放在一端,通过选择排序,执行K次就可以得到最大的K个数了。时间复杂度时O(N * K)。

代码实现

  //冒泡排序
    public static int[] topKByBubble(int[] arr, int k) {
        int[] ret = new int[k];
        if (k == 0 || arr.length == 0) {
            return ret;
        }
        for (int i = 0; i < k; i++) {
            for (int j = arr.length - 1; j < i; j--) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
            ret[i] = arr[i];
        }
        return ret;
    }
    //选择排序
    public static int[] topKBySelect(int[] arr, int k) {
        int[] ret = new int[k];
        for (int i = 0; i < k; i++) {
            int maxIndex = i;
            int maxNum = arr[maxIndex];
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] > maxNum) {
                    maxIndex = j;
                    maxNum = arr[j];
                }
            }
            if (maxIndex != i) {
                swap(arr, maxIndex, i);
            }
            ret[i] = arr[i];
        }
        return ret;
    }
    public static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

方法二

分治-快速排序

思路

1,快速排序的核心是分治思想,先通过分治partition把序列分为两个部分,再将两个部分进行再次递归

2,利用分治思想,即划分操作partition,根据主元素pivot调整序列,比pivot大的放在左端,比pivot小的放在右端,这样确定主元素pivot的位置pivotIndex,如果pivotIndex刚好是k-1,那么前k-1位置的数就是前k大的元素,即我们要求的top K。

时间复杂度: O(n)

代码实现

public static int[] topKByPartition(int[] arr, int k){
    if(arr.length == 0 || k <= 0){
        return new int[0];
    }
    return quickSort(arr,0,arr.length-1,k);

}
//快速排序
public static int[] quickSort(int[] arr, int low, int high, int k){
    int n = arr.length;
    int pivotIndex = partition(arr, low, high);
    if(pivotIndex == k-1){
        return Arrays.copyOfRange(arr,0,k);
    }else if(pivotIndex > k-1){
        return quickSort(arr,low,pivotIndex-1,k);
    }else {
        return quickSort(arr,pivotIndex+1,high,k);
    }
}
public static int partition(int[] arr, int low, int high){
   if(high - low == 0){
       return low;
   }
   int pivot = arr[high];
   int left = low;
   int right = high-1;
   while (left < right){
       while (left < right && arr[left] > pivot){
           left++;
       }
       while (left < right && arr[right] < pivot){
           right--;
       }
       if(left < right){
           swap(arr,left,right);
       }else {
           break;
       }
   }
   swap(arr,high,left);
   return left;
}
public static void swap(int[] arr,int a, int b){
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

方法三

利用堆

思路

1,构建一个最大堆

2,遍历原数组,元素入队,当堆的大小为K时,只需要将堆顶元素于下一个元素比较,如果大于堆顶元素,则将堆顶元素删除,将该元素插入堆中,直到遍历完所有元素

3,将queue存储的K个数出队

时间复杂度:为O(N*logK)

代码实现

public class TopK {
    public int[] smallestK(int[] arr, int k) {
        int[] ret = new int[k];
        if(k==0 || arr.length==0){
            return ret;
        }
        // 1,构建一个最大堆
        // jdk的优先级队列是最小堆, 就要用到我们比较器
        Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        //2,遍历原数组,进行入队
        for(int value:arr){
            if(queue.size() < k){
                queue.offer(value);
            }else{
                if(value < queue.peek()){
                    queue.poll();
                    queue.offer(value);
                }
            }
        }
        //3,将queue中存储的K个元素出队
        for(int i = 0;i < k;i++){
            ret[i] = queue.poll();
        }
        return ret;
    }
}

到此这篇关于Java深入分析与解决Top-K问题的文章就介绍到这了,更多相关Java Top-K内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java深入分析与解决Top-K问题

本文链接: https://lsjlt.com/news/147400.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java深入分析与解决Top-K问题
    目录题目解题方案方法一方法二方法三题目 求最小的K个数 设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 解题方案 方法一 排序(冒泡/选择) 思路 1,冒泡排序...
    99+
    2024-04-02
  • Java怎么解决Top-K的问题
    这篇文章主要介绍“Java怎么解决Top-K的问题”,在日常操作中,相信很多人在Java怎么解决Top-K的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么解决Top-K的问题”的疑惑有所帮助!...
    99+
    2023-06-30
  • Java怎么用堆解决Top-k问题
    本篇内容介绍了“Java怎么用堆解决Top-k问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、什么是堆?堆结构堆其实就是一种二叉树,但...
    99+
    2023-06-30
  • Java 详细讲解用堆解决Top-k问题
    目录1、什么是堆?堆结构大根堆 VS 小根堆大根堆(最大堆)小根堆(最小堆)优先级队列(PriorityQueue)2、top-k问题解决思路总结:要解决 top-k 问题,我们应该...
    99+
    2024-04-02
  • 【Python】中文乱码问题与解决方案 深入分析
    一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢? 在本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下: 1. UNICODE (...
    99+
    2023-09-03
    python 开发语言 编辑器
  • MySQL中IO问题的深入分析与优化
    目录前言一、业务背景二、分析方法1. MySQL 指标(1)  Redo 写次数(2) Row Operations(3) Buffer Pool 请求次数(4) 慢 SQ...
    99+
    2024-04-02
  • Java跨域问题分析与解决方法详解
    目录一、前言二、什么是跨域问题三、 为什么会出现跨域问题四、什么情况下会出现跨域五、如何解决跨域问题5.1 使用@CrossOrigin注解5.2 使用WebMvcConfigure...
    99+
    2023-05-20
    Java跨域问题原理 Java跨域问题解决方法 Java跨域问题
  • 如何深入剖析Firefox下margin-top失效原因与解决方案
    这期内容当中小编将会给大家带来有关如何深入剖析Firefox下margin-top失效原因与解决方案,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。和大家重点讨论一下Fir...
    99+
    2024-04-02
  • Java Autowired注解深入分析
    今天是正月初八,先祝大家新年快乐。前几天遇见了一次Autowired注入失败的问题,所以找时间研究了一下相关的Spring源码,分享一下。如果哪位大佬发现问题,请帮忙反馈。分享之前,...
    99+
    2023-01-31
    Java Autowired注解 Java Autowired
  • 深入IDEADebug问题透析详解
    目录引言问题引入Debug对代码简单分析打断点断点分析条件断点单步调试重回代码分析总结引言 本来通过问题引入,透析 IDEA Debug。通过阅读本文可以学习如何通过 IDEA 的 ...
    99+
    2023-01-08
    IDEA Debug问题透析 IDEA Debug
  • Java容器和Laravel同步问题解析:深入剖析!
    随着Web应用程序的日益复杂,Java容器和Laravel框架成为了越来越多的开发者的首选工具。但是,在使用这些工具的过程中,我们也会遇到一些同步问题。本文将深入剖析Java容器和Laravel框架的同步问题,并提供一些解决方案。 Jav...
    99+
    2023-09-14
    容器 同步 laravel
  • MySql深分页问题解决
    目录1. 问题描述2. 问题分析3. 验证测试3.1 创建两个表3.2 创建两个函数3.3 编写存储过程3.4 编写存储过程3.5 创建索引3.6 验证测试4. 解决方案4.1 使用索引覆盖+子查询优化4.2 起始位置重...
    99+
    2023-02-03
    MySql深分页
  • 分析和解决java.lang.OutOfMemoryError: Java heap space问题
    这里写目录标题 问题场景问题分析与解决1.优化项目代码2.提升Java heap size3.JVM参数配置配置参考堆区参数配置说明非堆区参数配置说明 问题场景 最近客户反馈在生...
    99+
    2023-10-24
    java jvm 开发语言 优化 内存
  • Java HashTable与Collections.synchronizedMap源码深入解析
    目录一、类继承关系图二、HashTable介绍三、HashTable和HashMap的对比1.线程安全2.插入null3.容量4.Hash映射5.扩容机制6.结构区别四、Collec...
    99+
    2022-11-13
    Java HashTable Java Collections.synchronizedMap
  • 关于MySQL死锁问题的深入分析
    前言 如果我们的业务处在一个非常初级的阶段,并发程度比较低,那么我们可以几年都遇不到一次死锁问题的发生,反之,我们业务的并发程度非常高,那么时不时爆出的死锁问题肯定让我们非常挠头。不过在死锁问题发生时,很多...
    99+
    2024-04-02
  • 深入解析WordPress:功能与特点分析
    WordPress 是一款功能强大的开源内容管理系统(Content Management System,CMS),广泛应用于网站建设和博客发布。它具有丰富的功能和特点,成为许多用户选...
    99+
    2024-03-01
    功能 特点
  • SpringBoot2深入分析解决java.lang.ArrayStoreException异常
    将某个项目从Spring Boot1升级Spring Boot2之后出现如下报错,查了很多不同的解决方法都没有解决: Spring boot2项目启动时遇到了异常: java.lan...
    99+
    2024-04-02
  • 快速解决mysql深分页问题
    目录背景概括1、limit深分页问题描述2、sql慢原因分析聚簇索引和非聚簇索引常见解决方案通过子查询优化标签记录法方案对比实战案例总结背景 日常需求开发过程中,相信大家对于limit一定不会陌生,但是使用limit时,...
    99+
    2022-07-13
    mysql深分页 mysql分页
  • 如何解决mysql深分页问题
    今天小编给大家分享一下如何解决mysql深分页问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2024-04-02
  • MySQL深分页问题解决思路
    目录一、MySQL深分页问题1、limit 语法解读2、回表二、优化方案一、MySQL深分页问题 我们在日常开发中,查询数据量比较大的时候,后端基本都会通过前端,移动端传过来的页码,...
    99+
    2022-12-22
    MySQL深分页 MySQL深分页问题
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作