当前位置: 首页 > news >正文

大数据中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数字&#xff0c;在其中找出最大的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+部署+讲解)

前言 博主简介&#x1f468;&#x1f3fc;‍⚕️&#xff1a;国内某一线互联网公司全栈工程师&#x1f468;&#x1f3fc;‍&#x1f4bb;&#xff0c;业余自媒体创作者&#x1f4bb;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f4d5;&#x…...

C++经典面试题目(四)

1、请解释const关键字的作用。 在C中&#xff0c;const关键字主要用来表示“不变性”&#xff0c;即被它修饰的东西是不可修改的。它可以用于多种上下文&#xff1a; 修饰基本数据类型变量&#xff1a;声明一个常量&#xff0c;一旦初始化后&#xff0c;其值就不能再更改。 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

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

风丘EV能量流测试解决方案 提高电动汽车续航能力

电动汽车&#xff08;EV&#xff09;近些年发展迅猛&#xff0c;已被汽车业内普遍认为是未来汽车发展的新方向&#xff0c;但现如今电动汽车仍然存在一些短板&#xff0c;导致其还无法替代传统燃油车。对此&#xff0c;首先想到的肯定就是电动车的续航问题。其实解决电动车续航…...

【Python】输出一个 Python 项目下需要哪些第三方包

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

程序员35岁会失业吗?【来自主流AI的回答】

程序员35岁会失业吗&#xff1f; 35岁被认为是程序员职业生涯的分水岭&#xff0c;许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长&#xff0c;技术更新换代的速度会使得资深程序员难以跟上&#xff1b;而另一些人则认为&#xff0c;丰富的经…...

每天30分钟python(第一天)

1.input 1.规则 input输入的是字符串 2.print打印规则&#xff1a; 整数不能与文字一起打印&#xff0c;但是字符串可以&#xff0c;所以将文字转换为字符串即可 print("小明今年"str(5)"岁了") 代码实践&#xff1a; 错误代码&#xff1a; # 实现 …...

gitlab简单介绍及安装使用

gitlab 概述 什么是 gitlab GitLab 是一个基于 Web 的 Git 仓库管理工具&#xff0c;提供了代码托管、版本控制、协作开发、持续集成和部署等功能。它类似于 GitHub&#xff0c;但是 GitLab 可以在私有服务器上部署&#xff0c;也可以使用 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; // 导入颜色…...

数据结构奇妙旅程之深入解析冒泡排序

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成…...

解决 sudo apt update E: The repository is not signed.

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

SCT2A26STER5.5V-100V Vin,4A峰值限流,高效异步降压DCDC转换器,替代LM5012、LM5013、LM5017、LM5164

• 5.5V-100V 输入电压 • 最大输出电压&#xff1a;30V • 2A 连续输出电流 • 4A峰值电流限制 • 1.2V 1% 反馈电压 • 集成500mΩ 高侧功率 MOSFETs • 140uA静态电流 • 恒定导通时间控制模式 • 4ms 内置软启动时间 • 300KHz 固定开关频率 • 可编程输入电压欠…...

前端学习资源整合

整合优质前端学习资源和文章&#xff0c;不定期更新。 JavaScript 现代 JavaScript 教程 官网&#xff1a;https://zh.javascript.info/GitHub&#xff1a;https://github.com/javascript-tutorial/zh.javascript.info 优秀的JS代码规范 官方英文版&#xff1a;https://gi…...

第16篇:奇偶校验器

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

Obsidian+PicGo+Gitee搭建免费图床

之前使用PicGoGitee配合Typora&#xff0c;后来因为换电脑Typora管理笔记不方便&#xff0c;换到Obsidian笔记&#xff0c;此处记录重新搭建图床的坑与经验。 主要参考# picGogitee搭建Obsidian图床&#xff0c;实现高效写作&#xff01; 1 下载安装PicGo 下载链接https://mo…...

计算机网络复试总结(五)

可能会问&#xff1a; 基础知识问题&#xff1a; 请简述TCP/IP协议栈的层次结构及其功能。 TCP/IP协议栈的层次结构及其功能可以简要概述如下&#xff1a; 层次结构&#xff1a; TCP/IP协议栈通常被划分为四个主要层次&#xff0c;从底层到高层分别是网络接口层&#xff08;也…...

设计模式 --4:工厂方法模式

总结 &#xff1a; 个人理解&#xff1a; 工厂方法模式就是在简单工程模式的基础下将工厂类抽象出来。如果不抽象工厂类 &#xff0c;每一次创建一个新的算法&#xff0c;都要修改原来的工厂类&#xff0c;这不符合 开放–封闭原则 将工厂类给抽象出来&#xff0c;让具体的算法…...

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源拷贝到指…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...