取topN不同算法的实现的性能差别

news2025/2/27 23:17:34

背景

最近在实现一个需求,需要对大量数据中排序出前N,最暴力的方法肯定是直接全量排序。这里很明显是可以不用全量排序的,取前N,我们自然而然可以想到一个算法——堆排序。
一开始自己先写好了一版,后来想起,这个完全可以交给AI来实现,在好奇心的驱使下,于是我让ChatGPT实现了一个topN的算法,于是有了这篇文章。

测试

以下只将对项目业务进行简化:直接排序一个int数组,长度100w,排出top 1w,模拟100次。
测试在原始数组不同情况下,各个实现的实际耗时。

public class MyTest {
    private static int totalCount = 100_0000;//总数量
    private static int rankSize = 10000;//排行榜长度
    private static int batch = 100;//测试次数

    public static void main(String[] args) {
        List<Integer> values = new ArrayList<>();
        for (int i = 0; i < totalCount; i++) {
            values.add(i);
        }
        //默认递增
        Collections.shuffle(values);//打乱顺序
        //Collections.reverse(values);//递减顺序
        topN_NiuMa(values);
        topN_ChatGPT(values);
        topN_BruteForce(values);

    }

    //牛马版
    private static void topN_NiuMa(List<Integer> values) {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < batch; i++) {
            PriorityQueue<Integer> queue = new PriorityQueue<>(rankSize);
            for (Integer value : values) {
                queue.offer(value);
                if (queue.size() > rankSize) {
                    queue.poll();
                }
            }
        }
        long endTime = System.currentTimeMillis();
        long cost = endTime - startTime;
        System.out.println("牛  马  版(100次):" + cost + " ms");
    }

    //ChatGPT版
    private static void topN_ChatGPT(List<Integer> values) {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < batch; i++) {
            PriorityQueue<Integer> queue = new PriorityQueue<>(rankSize);
            for (Integer value : values) {
                if (queue.size() < rankSize) {
                    queue.offer(value);
                } else if (value > queue.peek()) {
                    queue.poll();
                    queue.offer(value);
                }
            }
        }
        long endTime = System.currentTimeMillis();
        long cost = endTime - startTime;
        System.out.println("ChatGPT版(100次):" + cost + " ms");
    }

    //暴力版
    public static void topN_BruteForce(List<Integer> values) {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < batch; i++) {
            List<Integer> values1 = new ArrayList<>(values);
            Collections.sort(values1, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return Integer.compare(o2, o1);
                }
            });
        }

        long endTime = System.currentTimeMillis();
        long cost = endTime - startTime;
        System.out.println("暴  力  版(100次):" + cost + " ms");

    }
}

结果

待排数据递增(与目标相反)

牛 马 版(100次):8977 ms
ChatGPT版(100次):8874 ms
暴 力 版(100次):377 ms
在这里插入图片描述

待排数据递减(与目标相同)

牛 马 版(100次):9342 ms
ChatGPT版(100次):516 ms
暴 力 版(100次):338 ms
在这里插入图片描述

待排数据随机(符合实际情况)

牛 马 版(100次):13355 ms
ChatGPT版(100次):2539 ms
暴 力 版(100次):19483 ms
在这里插入图片描述

结论

暴力版,在原始数据有序的情况下,表现出惊人的性能,这里得益于java底层对排序算法的优化。
牛马版,在原始数据有序的情况下表现略微优于完全无序的情况,但总体表现不佳。
ChatGPT,在原始数据与目标顺序形的情况下表现良好,原始数据与目标数据相反时,表现较差,原始数据无序的情况下表现最优,这也是最正统的topN算法的实现。
在实际生产环境中,正统的topN算法是有不错的表现的。

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

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

相关文章

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.1.2典型应用场景:日志分析、实时搜索、推荐系统

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 为什么选择Elasticsearch&#xff1f;——典型应用场景深度解析1. 引言2. 日志分析&#xff1a;海量数据的实时洞察2.1 行业痛点2.2 ES解决方案关键技术实现&#xff1a; 2.…

Spring Cloud Alibaba学习 3- Sentinel入门使用

Spring Cloud Alibaba学习 3- Sentinel入门使用 中文文档参考&#xff1a;Sentinel中文文档 一. SpringCloud整合Sentinel 1.1 下载Sentinel-Dashboard Sentinel下载地址&#xff1a;Sentinel-Dashboard 到下载目录&#xff0c;cmd输入 java -jar sentinel-dashboard-1.8…

使用DeepSeek/chatgpt等AI工具辅助网络协议流量数据包分析

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍一下deepseek等LLM在分数流量数据包这方面的能力。为需要借助LLM等大模型辅助分析流量数据包的同学提供参考&#xff0c;也了解一下目前是否有必要继续学习wireshark工具以及复杂的协议知识。 pcap格式 目…

C语言 --- 经典习题1

C语言 --- 经典习题1 第 一 题 - - - 交 换 两 个 整 数 的 值&#xff08;四 种 方 法&#xff09;第 二 题 - - - 最 大 公 约 数 和 最 小 公 倍 数 之 和总结 &#x1f4bb;作者简介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &#x1…

自定义mybatis拦截器,在springboot项目中不起作用的解决方法

自定义mybatis拦截器&#xff0c;在springboot项目中不起作用的解决方法 自定义mybatis拦截器&#xff0c;在若依springboot项目中不起作用的原因 找到 MyBatisConfig 配置类&#xff0c;引入自定义配置 在sqlSessionFactory中添加自定义拦截器&#xff0c;就可以正常使用了…

记录一下在k3s快速创建gitlab

废话不多说&#xff0c;直接上配置文件 需要修改的地方&#xff08;备注都有写&#xff09;&#xff1a; 1.命名空间 namespace 2. claimName 文件挂载 Deployment kind: Deployment apiVersion: apps/v1 metadata:name: gitlabnamespace: cicd # 替换为您的命名空间la…

AWQ和GPTQ量化的区别

一、前言 本地化部署deepseek时发现&#xff0c;如果是量化版的deepseek&#xff0c;会节约很多的内容&#xff0c;然后一般有两种量化技术&#xff0c;那么这两种量化技术有什么区别呢&#xff1f; 二、量化技术对比 在模型量化领域&#xff0c;AWQ 和 GPTQ 是两种不同的量…

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…

湖北中医药大学谱度众合(武汉)生命科技有限公司研究生工作站揭牌

2025年2月11日&#xff0c;湖北中医药大学&谱度众合&#xff08;武汉&#xff09;生命科技有限公司研究生工作站揭牌仪式在武汉生物技术研究院一楼101会议室举行&#xff0c;湖北中医药大学研究生院院长刘娅教授、基础医学院院长孔明望教授、基础医学院赵敏教授、基础医学院…

面试基础---深入解析 AQS

深入解析 AQS&#xff1a;从源码到实践&#xff0c;剖析 ReentrantLock 和 Semaphore 的实现 引言 在 Java 并发编程中&#xff0c;AbstractQueuedSynchronizer&#xff08;AQS&#xff09;是一个核心框架&#xff0c;它为构建锁和其他同步器提供了基础支持。ReentrantLock 和…

从 0 到 1,用 Python 构建超实用 Web 实时聊天应用

从 0 到 1&#xff0c;用 Python 构建超实用 Web 实时聊天应用 本文深入剖析如何运用 Python 的 Flask 框架与 SocketIO 扩展&#xff0c;搭建一个功能完备的 Web 实时聊天应用。从环境搭建、前后端代码实现&#xff0c;到最终运行展示&#xff0c;逐步拆解关键步骤&#xff0…

Vue2+Element实现Excel文件上传下载预览【超详细图解】

目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一&#xff1a;代码 方式二&#xff1a;代码 3.文件预览 图片示例 方式一&#xff1a;代码 方式二&#xff1a;代码 一、需求背景 在一个愉快的年后&#xff…

[记录贴] 火绒奇怪的进程保护

最近一次更新火绒6.0到最新版&#xff0c;发现processhacker的结束进程功能无法杀掉火绒的进程&#xff0c;弹窗提示如下&#xff1a; 可能是打开进程时做了权限过滤&#xff0c;火绒注册了两个回调函数如下&#xff1a; 但奇怪的是&#xff0c;在另外一台机器上面更新到最新版…

【蓝桥杯】每天一题,理解逻辑(1/90)【Leetcode 移动零】

文章目录 题目解析讲解算法原理【双指针算法思路】(数组下标充当指针)如何划分和执行过程大致 代码详情 题目解析 题目链接&#xff1a;https://leetcode.cn/problems/move-zeroes/description/ 题目意思解析 把所有的零移动到数组的末尾保持非零元素的相对顺序 理解了这两层…

pycharm远程连接服务器运行pytorch

Linux部署pytorch 背景介绍 不同的开源代码可能需要不同的实验环境和版本&#xff0c;这时候的确体现出Anaconda管理环境的好处了&#xff0c;分别搞一个独立环境方便管理。 有的教程建议选择较旧的版本&#xff0c;但笔者建议在条件允许的情况下安装最新版&#xff0c;本次…

java练习(41)

ps&#xff1a;题目来自力扣 最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 import java.util.Arrays;class Solut…

PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍

2025-02-22 20:10物联全栈123 尊敬的诸位&#xff01;我是一名物联网工程师。关注我&#xff0c;持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中&#xff0c;扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…

轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置

一、使用Anaconda创建虚拟环境 1. 安装Anaconda 2..conda常用的命令 3. 创建虚拟环境-以搭建MachineVision为例 4. 激活虚拟环境 5. 安装依赖包 二、PyCharm配置环境 在进行Python项目开发时&#xff0c;合理的环境管理是必不可少的&#xff0c;特别是当你在多个项目中…

驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线

一:概述 Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及…

MinIO整合SpringBoot实现文件上传、下载

文章目录 配置1. 部署MinIO服务2. 整合SpringBoot 功能实现1. 文件上传2. 文件下载 总结 配置 1. 部署MinIO服务 这里以docker为例&#xff1a; 安装minio命令docker run -p 9000:9000 -p 9001:9001 \ --name minio \ -v /path/to/data:/data \ -e "MINIO_ROOT_USERmin…