大数据中TopK问题
1.给定100个int数字,在其中找出最大的10个;
import java.util.PriorityQueue;public class Main {public static void main(String[] args) {final int topK = 3;int[] vec = {4, 1, 5, 8, 7, 2, 3, 0, 6, 9};PriorityQueue<Integer> pq = new PriorityQueue<>(topK);for (int x : vec) {pq.offer(x);if (pq.size() > topK) {// 如果超出个数,则弹出堆顶(最小的)数据pq.poll();}}while (!pq.isEmpty()) {System.out.println(pq.poll()); // 输出依次为7,8,9}}
}
⒉给定10亿个int数字,在其中找出最大的10个(这10个数字可以无序);
3.给定10亿个int数字,在其中找出最大的10个(这10个数字依次排序);
有时候topK问题会遇到数据量过大,内存无法全部加载。这个时候,可以考虑将数据存放至bitmap中,方便查询。
比如,给出10个int 类型的数据,分别是【13,12,11,1,2,3,4,5,6,7】,int类型的数据每个占据4个字节,那这个数组就占据了40个字节。现在,把它们放到一个16个长度bool的 bitmap中,结果就是【0,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0】,在将空间占用降低至4字节的同时,也可以很方便的看出,最大的3个数字,分别是11,12和13。
需要说明的是,bitmap结合跳表一起使用往往有奇效。比如以上数据还可以记录成:从第1位开始,有连续7个1;从第11位开始,有连续3个1。这样做,空间复杂度又得到了进一步的降低。
这种做法的优势,当然是降低了空间复杂度。不过需要注意一点,bitmap比较适合不重复且有范围(比如,数据均在0~10亿之间)的数据的查询。至于有重复数据的情况,可以考虑与hash 等结构的混用。
4.给定10亿个不重复的int数字,在其中找出最大的10个;
如果遇到了查询string类型数据的大小,可以考虑hash方法。
举个例子,10个string数字【"1001""23","1002",“3003"“2001","1111","65",“834","5",“987"】找最大的3个。我们先通过长度进行hash,得到长度最大为4,且有5个长度为4的string。接下来再通过最高位值做hash,发现有1个最高位为"3'的,1个为"2"的,3个为"1"的。接下来,可以通过再设计 hash函数,或者是循环的方式,在3个最高位为"1"的sting 中找到最大的一个,即可找到3个最值大的数据。
这种方法比较适合网址或者电话号码的查询。缺点就是如果需要多次查询的话,需要多次计算 hash,并且需要根据实际情况设计多个hash 函数。
5.给定10个数组,每个数组中有1亿个int数字,在其中找出最大的10个;
字典树(trie)的具体结构和查询方式,不在这里熬述了,自行百度一下就有很多。这里主要说一下优缺点。
字典树的思想,还是通过前期建立索引信息,后期可以反复多次查询,并且后期增删数据也很方便。比较适合于需要反复多次查询的情况。
比如,反复多次查询字符序(例如: z>y. ….>b>a)最大的k个url这种,使用字典树把数据存储一遍,就非常适合。既减少了空间复杂度,也加速了查询效率。
6.给定10亿个string类型的数字,在其中找出最大的10个(仅需要查1次);
以上几种方法,都是比较独立的方法。其实,在实际工作中,遇到更多的问题还是混合问题,这就需要我们对相关的内容,融会贯通并且做到活学活用。
我举个例子︰我们的分布式服务跑在10台不同机器上,每台机器上部署的服务均被请求1000次,并且记录了个这1000次请求的耗时(耗时值为int 数据),找出这10*10000次请求中,从高到低的找出耗时最大的50个。看看这个问题,很现实吧。我们试着用上面介绍的方法,组合一下来求解。
#方法一
首先,对每台机器上的10000个做类似快排,找出每台机器上top50的耗时信息。此时,单机上的这50条数据是无序的。
然后,再将10台机器上的50条数据(共500条))放到一起,再做一次类似快排,找到最大的50个(此时应该这50个应该是无序的)。
最后,对这50个数据做快排,从而得到最终结果。
7.给定10亿个string类型的数字,在其中找出最大的k个(需要反复多次查询,其中k是一个随机数字)。
首先通过堆排,分别找出10台机器上耗时最高的50个数据,此时的这50个数据,已经是从大到小有序的了。
然后,我们依次取出10台机器中,耗时最高的5条放入小顶堆中。
最后,遍历10台机器上的数据,每台机器从第6个数据开始往下循环,如果这个值比堆顶的数据大,则抛掉堆顶数据并且把它加入,继续用下一个值进行同样比较。如果这个值比堆顶的值小,则结束当前循环,并且在下一台机器上做同样操作。
相关文章:
大数据中TopK问题
1.给定100个int数字,在其中找出最大的10个; import java.util.PriorityQueue;public class Main {public static void main(String[] args) {final int topK 3;int[] vec {4, 1, 5, 8, 7, 2, 3, 0, 6, 9};PriorityQueue<Integer> pq new PriorityQueue<…...

基于SpringBoot+MyBatis+Vue的电商智慧仓储管理系统的设计与实现(源码+LW+部署+讲解)
前言 博主简介👨🏼⚕️:国内某一线互联网公司全栈工程师👨🏼💻,业余自媒体创作者💻,CSDN博客专家🏆,Java领域优质创作者📕&#x…...
C++经典面试题目(四)
1、请解释const关键字的作用。 在C中,const关键字主要用来表示“不变性”,即被它修饰的东西是不可修改的。它可以用于多种上下文: 修饰基本数据类型变量:声明一个常量,一旦初始化后,其值就不能再更改。 co…...
2024/3/24 蓝桥杯
P1678 烦恼的高考志愿 二分 import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m sc.nextInt();int[] a new int[n1];//学校int[] b new int[m…...

用户验证:Streamlit应用程序与Streamlit-Authenticator
写在前面 在数字化时代,数据安全和用户隐私越来越受到重视。对于使用Streamlit构建的Web应用程序来说,确保用户的安全身份验证是至关重要的。而Streamlit-Authenticator,作为一个专门为Streamlit应用程序设计的身份验证库,正成为保…...

风丘EV能量流测试解决方案 提高电动汽车续航能力
电动汽车(EV)近些年发展迅猛,已被汽车业内普遍认为是未来汽车发展的新方向,但现如今电动汽车仍然存在一些短板,导致其还无法替代传统燃油车。对此,首先想到的肯定就是电动车的续航问题。其实解决电动车续航…...

【Python】输出一个 Python 项目下需要哪些第三方包
方法一 pycharm 方法二 要分析一个 Python 项目下需要哪些第三方包并生成 requirements.txt 文件,你可以使用 pipreqs 工具。以下是具体的步骤: 首先,确保你已经安装了 pipreqs 工具。如果未安装,可以使用以下命令进行安装&a…...

程序员35岁会失业吗?【来自主流AI的回答】
程序员35岁会失业吗? 35岁被认为是程序员职业生涯的分水岭,许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长,技术更新换代的速度会使得资深程序员难以跟上;而另一些人则认为,丰富的经…...
每天30分钟python(第一天)
1.input 1.规则 input输入的是字符串 2.print打印规则: 整数不能与文字一起打印,但是字符串可以,所以将文字转换为字符串即可 print("小明今年"str(5)"岁了") 代码实践: 错误代码: # 实现 …...

gitlab简单介绍及安装使用
gitlab 概述 什么是 gitlab GitLab 是一个基于 Web 的 Git 仓库管理工具,提供了代码托管、版本控制、协作开发、持续集成和部署等功能。它类似于 GitHub,但是 GitLab 可以在私有服务器上部署,也可以使用 GitLab 提供的托管服务。GitLab 支持…...
NetCore itext7 创建、编辑PDF插入表格、图片、文字(三)
NetCore 创建、编辑PDF插入表格、图片、文字 NetCore 创建、编辑PDF插入表格、图片、文字(二) NetCore 创建、编辑PDF插入表格、图片、文字(三) 直接上代码 nuget引入 itext7 using System; using System.IO;using iText.IO.Image; using iText.Kernel.Colors; // 导入颜色…...
数据结构奇妙旅程之深入解析冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成…...

解决 sudo apt update E: The repository is not signed.
一段时间没有用ubuntu系统,出现了很多这样的报错 解决方法 cd /etc/apt/sources.list.d ls然后把报错的项目从里面移除,例如 sudo rm cudnn-local-ubuntu2004-8.7.0.84.list全部移除后,再sudo apt-get update就能成功...

SCT2A26STER5.5V-100V Vin,4A峰值限流,高效异步降压DCDC转换器,替代LM5012、LM5013、LM5017、LM5164
• 5.5V-100V 输入电压 • 最大输出电压:30V • 2A 连续输出电流 • 4A峰值电流限制 • 1.2V 1% 反馈电压 • 集成500mΩ 高侧功率 MOSFETs • 140uA静态电流 • 恒定导通时间控制模式 • 4ms 内置软启动时间 • 300KHz 固定开关频率 • 可编程输入电压欠…...
前端学习资源整合
整合优质前端学习资源和文章,不定期更新。 JavaScript 现代 JavaScript 教程 官网:https://zh.javascript.info/GitHub:https://github.com/javascript-tutorial/zh.javascript.info 优秀的JS代码规范 官方英文版:https://gi…...

第16篇:奇偶校验器
Q:本期我们将实现4位奇偶校验逻辑电路,即校验4位二进制代码中 “1” 的个数是奇数或偶数。 A:奇偶校验器的基本原理:采用异或运算对“1”的奇偶个数进行校验,从最高位依次往最低位进行连续异或运算。如果最后的异或运…...

Obsidian+PicGo+Gitee搭建免费图床
之前使用PicGoGitee配合Typora,后来因为换电脑Typora管理笔记不方便,换到Obsidian笔记,此处记录重新搭建图床的坑与经验。 主要参考# picGogitee搭建Obsidian图床,实现高效写作! 1 下载安装PicGo 下载链接https://mo…...
计算机网络复试总结(五)
可能会问: 基础知识问题: 请简述TCP/IP协议栈的层次结构及其功能。 TCP/IP协议栈的层次结构及其功能可以简要概述如下: 层次结构: TCP/IP协议栈通常被划分为四个主要层次,从底层到高层分别是网络接口层(也…...

设计模式 --4:工厂方法模式
总结 : 个人理解: 工厂方法模式就是在简单工程模式的基础下将工厂类抽象出来。如果不抽象工厂类 ,每一次创建一个新的算法,都要修改原来的工厂类,这不符合 开放–封闭原则 将工厂类给抽象出来,让具体的算法…...
Linux系统centos7.6更换yum源以及下载安装包到指定目录
一、Linux系统centos7.6更换yum源 [rootlocalhost sofware]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# mkdir back [rootlocalhost yum.repos.d]# mv * back [rootlocalhost yum.repos.d]# cp -a /root/software/CentOS7-Base-163.repo . #将准备好的yum源拷贝到指…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...