最小(大)堆实现topK问题

2023-11-02

最小(大)堆实现topK问题

topK问题:即求一组数据中最大(最小)的前K个数据,一般情况下数据量都比较大。
比如:班级前10名、世界500强、等级分排名等。
对于topK问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了 ( 可能数据都不能一下子全部加载到内存中)

推荐采用堆的方式去解决



import com.yybt.datastructure.heap.MyHeap;

/**
 * 最小堆实现topk
 * @author liuzehong
 *
 */
public class TopK {

    // 存储数据
    private MyHeap<Integer> myHeap;

    // 百亿数据找前k个元素。也就是tree的最大size。
    private int k;
    // 元素个数
    private int size = 0;

    public TopK(int k) {
        this.myHeap = new MyHeap<Integer>(this.k=k);
    }

    // 插入元素
    public void insert(int v) {
        // 如果size小于k,直接往里添加元素
        if (this.size < this.k) {
            myHeap.insert(v);
            size++;
            return;
        }else {
            //如果堆中最大值大于v,则删除最大值,插入v
            if (myHeap.get(0) >v) {
                myHeap.delete(0);
                myHeap.insert(v);
            }
        }

    }

    public void show() {
        myHeap.show();
    }



    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        long a=System.currentTimeMillis();
        TopK topK = new TopK(10);
        for (int i = 1000000; i >= 1; i--) {
            topK.insert(i);
        }
        topK.show();
        long b=System.currentTimeMillis();
        System.out.println("耗时:"+(b-a)+"毫秒");
    }


}

说明

其中,MyHeap为最小堆实现,详情参考 https://github.com/yybtlzh/-.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最小(大)堆实现topK问题 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • Android实现Activity的跳转(Android学习笔记2)

    Android实现Activity的跳转 一 创建新的Activity 二 设计主界面和菜单界面 三 实现Activity的跳转 1 显示意图跳转Activity的三种方式 1 1 方式一 1 2 方式二 1 3 方式三 2 隐式意图跳转A
  • 【安全研究】从mimikatz学习Windows安全之访问控制模型(三)

    作者 Loong716 Amulab 0x00 前言 在之前的文章中 分别向大家介绍了Windows访问控制模型中的SID和Access Token 本篇文章中将为大家介绍最后一个概念 特权 Windows操作系统中许多操作都需要有对应的特
  • Antv G2plot学习笔记(一)

    Antv G2plot学习笔记 一 官方网址 https g2plot antv vision zh 在执行官方的实例中 发现无法将数据进行图表展示 经过好友的分享和实践发现是出在变量引用不到的问题 之前的const linePlot ne
  • opencv2与opencv的不同

    一 Opencv2与opencv1的区别 Opencv1 0版本于2006年面世 主要基于C语言 2009年发布opencv2 主要基于C 此时OpenCV库被划分成多个模块 这些模块被编译成库文件后 位于lib文件夹中 主要有以下模块 版
  • AIX 文件 打包 与 压缩 tar gzip compress 的使用

    今天在Aix用tar cvf 备份 打成tar包 占有硬盘空间过大 没有压缩比 尝试使用tar zcvf linux系统下可以用 z 命令 z 用gzip来压缩 解压缩文件 加上该选项后可以将档案文件进行压缩 但还原时也一定要使用该选项进行
  • (Visual Grounding 论文研读) Pseudo-Q: Generating Pseudo Language Queries for Visual Grounding, 2022 CVPR

    最近在看关于visual grounding的文章 对于文章中理解不恰当的内容欢迎批评指正 本文将根据论文的结构来组织结构并且展开一定的拓展 Abstract visual grounding VG 即根据自然语言查询在图像中定位对象 是视
  • m3u8加密文件原理及下载脚本

    一 加密ts文件解密 EXTM3U EXT X VERSION 3 EXT X MEDIA SEQUENCE 0 EXT X ALLOW CACHE YES EXT X TARGETDURATION 13 EXT X KEY METHOD
  • GBASE 8s 表分片

    表分片 技术允许在表一级对数据存储进行控制 用户可以对表中的记录或索引进行分组 并且存储在不同的位 置 这样可以将数据存储到多个磁盘上 从而减少对磁盘I O的竞争 数据分片的方案以及分片数据所存放的一组 dbspace构成了 分片策略 数据
  • Canvas对ImageData进行Resize操作(平滑高性能处理)

    问题背景 通过getImageData函数得到的ImageData通过putImageData重新放到canvas容器无法进行resize操作 如果通过toDataURL函数转为Image再使用drawImage函数性能太差 解决代码 处理
  • 数据科学编程技能

    特点 使用数据科学技术 您可以将原始数据转化为可操作的见解 适用于从城市规划到精准医学的各个领域 数据科学编程技能汇集了您入门所需的所有基础技能 即使您没有编程或数据科学经验 指导安装和配置解决专业级数据科学问题所需的工具 包括广泛使用的
  • 配置CentOS8 yum镜像源

    配置yum镜像主要修改三个文件 文件位置 etc yum repos d CentOS Linux AppStream repo 将上面的两段代码注释掉 之后添加清华镜 清华云镜像地址 baseurl https mirrors tuna
  • 【问题记录】pytorch自定义数据集 No such file or directory, invalid index of a 0-dim

    保存模型 保存整个神经网络的结构和模型参数 torch save mymodel mymodel pkl 只保存神经网络的模型参数 torch save mymodel state dict mymodel params pkl 导入模型
  • [Linux]Ubuntu下idea的idea64.vmoption文件

    换了ubuntu环境开发 动了help gt Edit custom Vm options的文件 导致idea无法打开 解决办法 删除 root config JetBrains IntelliJIdea2022 1 idea64 vmop
  • [电动智能汽车-4]:原理 - 高压电源系统与互锁系统

    目录 第1章 高压电源系统概述 1 1 高压电源系统原理图 1 2 高压电源系统连接图 1 3 互锁 第2章 动力电池 2 1 安装位置 2 2 动力电池的外观 2 3 动力电池的组成 2 4 电芯的类型 2 5 电池包的参数 2 6 高压
  • Docker的Compose规范现已成为开放标准

    由Docker创建的用于定义多容器应用程序的系统Docker Compose现在将作为开放标准进行开发 称为新标准的Compose规范旨在允许Compose创建的应用程序在Kubernetes和Amazon Elastic Containe
  • 你不知道的JavaScript----promise

    目录 什么是Promise Promise Promise 值 完成事件 Promise 事件 具有 then 方法的鸭子类型 Promise 信任问题 调用过早 调用过晚 Promise 调度技巧 回调未调用 调用次数过少或过多 未能传递
  • 正则表达式之旅_sed_awk

    谈谈正则表达式这个东西 我想作为一个程序员 正则表达式大家绝对不陌生 正则表达式好像一个有限则动机 主要作用是匹配 但是同时因为这个功能 我们可以扩展很多其他用法 像很多语言都引人了正则表达式 java C 等面向对象语言 更多的是脚本语言
  • 基于Smack3.0.4+ Openfire3.10.2开发之Android 客户端之一

    我们在之前依次介绍openfire部署以及smack常用API的使用 这一节中我们着力介绍如何基于asmack开发一个Android的客户端 本篇的重点在实践 讲解和原理环节 大家可以参考前面我所发布的OpenFire和Smack的相关文章
  • Vmware 显示“您在运行该虚拟机时启用了侧通道缓解+DevicePowerOn”启动失败+模块“VPMC”启动失败”

    一 问题描述 首先显示 您在运行该虚拟机时启用了侧通道缓解 侧通道缓解可增强安全性 但也会降低性能 要禁用缓解 请在虚拟机设置的 高级 面板中更改侧通道缓解设置 有关更多详细信息 请参阅 VMware 知识库文章 79832 网址为 htt
  • 最小(大)堆实现topK问题

    最小 大 堆实现topK问题 topK问题 即求一组数据中最大 最小 的前K个数据 一般情况下数据量都比较大 比如 班级前10名 世界500强 等级分排名等 对于topK问题 能想到的最简单直接的方式就是排序 但是 如果数据量非常大 排序就