大数据中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源拷贝到指…...
ESP32智能硬件开发实战:基于MCP协议的AI语音助手全栈指南
ESP32智能硬件开发实战:基于MCP协议的AI语音助手全栈指南 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 在AIoT(人工智能物联网)…...
Python并发安全性重构白皮书(GIL禁用场景下的原子操作黄金标准)
第一章:Python并发安全性重构白皮书(GIL禁用场景下的原子操作黄金标准)当通过 PyPy、Cython(启用 nogil)、或 Python 3.12 的实验性子解释器(PEP 684)等路径绕过全局解释器锁(GIL&am…...
MyBatis-Plus 大表分页 count () 性能瓶颈深度解析
在使用MyBatis-Plus进行大表分页查询时,你是否通过日志发现,分页插件总会先执行一条count()语句,且这条count()在千万级数据下耗时极长,严重拖慢整体响应?本文将从源码层面剖析MyBatis-Plus分页count()的执行机制&…...
w3x2lni:魔兽地图跨版本兼容解决方案技术指南
w3x2lni:魔兽地图跨版本兼容解决方案技术指南 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 价值定位:破解魔兽地图版本壁垒 当你尝试在1.32.8版本魔兽争霸III中运行经典的1.24.4地图时&…...
intv_ai_mk11实测效果:在24GB显存限制下保持128~512 token长文本生成质量
intv_ai_mk11实测效果:在24GB显存限制下保持128~512 token长文本生成质量 1. 模型效果惊艳展示 intv_ai_mk11作为一款基于Llama架构的中等规模文本生成模型,在24GB显存环境下展现出了令人印象深刻的长文本生成能力。不同于常规模型在显存限制下容易出现…...
大模型Post-training实战:从新手到高手的进阶秘籍,收藏这份学习指南!
本文系统梳理了大语言模型(LLM)后训练(Post-training)的核心方法与最新进展,通过餐厅培训厨师的类比帮助读者建立直观理解。文章详细解析了监督微调(SFT)、基于人类反馈的强化学习(R…...
对于对话中的用户流失预测,OpenClaw 的预测模型特征有哪些?
在讨论对话场景中的用户流失预测时,OpenClaw 的预测模型特征设计其实体现了一种很务实的思路。它没有追求那种听起来特别炫酷、参数庞大的复杂架构,而是把重点放在了如何从实际的对话数据中提取出真正能反映用户去留意图的信号。 这些特征大致可以归为几…...
颠覆级植物大战僵尸修改工具:一站式资源管理与战局掌控解决方案
颠覆级植物大战僵尸修改工具:一站式资源管理与战局掌控解决方案 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 还在为植物大战僵尸中阳光不足而焦虑吗?面对海量僵尸浪潮却束…...
忍者像素绘卷微信小程序集成指南:轻量API调用与像素输出适配
忍者像素绘卷微信小程序集成指南:轻量API调用与像素输出适配 1. 项目概述与核心价值 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工具,专为16-Bit复古游戏美学风格设计。它通过轻量级API服务,让开发者能够快速将像素艺术生成能…...
突破音乐加密限制:Unlock Music实现跨平台音频自由解决方案
突破音乐加密限制:Unlock Music实现跨平台音频自由解决方案 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: …...
