海量数据小内存!如何找到高频数

news2024/11/15 15:38:53

文章目录

    • 题目
    • 解答
    • 总结

题目

如何在 20 亿个无符号整数中找到出现次数最多的那个数,在只提供 1 G 内存的条件下

解答

找到出现次数最多的数,通常的思维就是使用 HashMap 来统计这 20 亿个无符号整数中每个数出现的次数

已知只有 20 亿个数,那么我们使用 int 类型就足以来统计这些数了,那么一条 Hash 表记录 key 需要 4 个字节,value 需要 4 个字节,一条记录至少 8 个字节。最坏情况下,这 20 亿个数都是不同的,那么就需要 160 亿字节,即 16 G,在题目提供的 1 G内存条件下,显然是没有办法解决问题的

在这里插入图片描述

我们知道 Hash 函数,调完之后的结果分布具有离散性和均匀性这样的性质,并且同一个值调用同一个 Hash 函数,最后得到的结果一定是一样的

可以将这 20 亿个数分别进行调用 Hash 函数,然后将产生的结果 %100,最后得到的值的范围就是 0 ~ 99,将结果为 i 的数存放到文件 Ai 中。遍历就结束后,我们就可以得到 100 个小文件。因为调用过 Hash 函数后,结果是比较均匀的,所以每个小文件的数通过 HashMap 统计词频所占内存空间大小最多 0.16 G,妥妥的比 1 G小,如果不幸仍有超过 1 G,就采用相同的方式将 20 亿个数分解到更多的小文件中

根据 Hash 函数的性质,此时小文件中含有不同的数字种类是差不多的,相同的数一定被放在了同一个文件夹中

之后的事就非常好办了,我们只需要将小文件里的数通过 HashMap 进行频率统计,每个文件中都会决出一个出现次数最多的数字,一个文件统计完后,就可以释放内存,最后 100 个小文件产出的结果中在做对比,产出最后的结果,即出现次数最多的数

试问:如果我们想要从这 20 亿个数中找到频率最高的 100 个数,还是 1 G内存怎么找?

前面的将每个数进行调用 Hash 函数,%100,分成 100 个小文件的操作是一样的,只不过每个小文件中频率统计的操作中,我们需要依次遍历每个小文件,构建一个大小为 100 的小根堆(小根堆的特点就是当前节点比它的孩子小)。

如果遍历到的数出现的次数大于堆顶数出现的次数,那么就让新的数顶替堆顶的数,重新调整为小根堆,自然,遍历结束后,小根堆上的数就是出现频率最高的 100 个数

总结

  • 分而治之,将大数据进行哈希取余,从而分成小文件
  • 使用 HashMap 频率统计
  • 将数据整合比对

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

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

相关文章

b站黑马的Vue快速入门案例代码——【axios+Vue2】悦听player(音乐播放器)

目录 本文中修改的原代码中的BUG: 修改方法: 本文案例代码仍有的BUG:(欢迎大家献计献策) 目标效果: 悦音player案例——效果展示视频: 更换的新接口/参数: 1.歌曲搜索接口&…

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

1 缘起 作为一个应用开发人员而言,会使用某一个工具分为两个层次(个人观点): 第一个层次,知道工具,会使用这个工具解决问题; 第二个层次,理解工具的实现原理。 关于Spring的学习&am…

Linux Centos7 磁盘的分区、挂载

1、前言 注:看不懂的同学可以直接跟着后面的步骤操作 一块新的磁盘放到电脑上,要经过分区-->给分区设置文件系统--->挂载才能用。 也就是说要想将磁盘挂载,必须完成给磁盘分区和给分区设置文件系统这两步。 分区的时候先分成主分区和扩…

【DBN分类】基于matlab深度置信网络DBN变压器故障诊断【含Matlab源码 2284期】

一、深度置信网络DBN变压器故障诊断简介 1 DBN模型 DBN是深度学习中最关键的一个多层网络架构,如图2所示,由多层RBM堆叠而成,前一层RBM的输出为后一层RBM的输入,最顶层采用Softmax分类器作为标签层,输出分类识别的结果…

AD-DA转换(PCF8591)

AD转换目录一、AD转换(PCF8591)①初始化函数②读取ADC值的函数二、DA转换(PCF8591)三、STC15系列单片机用户手册.pdf—第10章一、AD转换(PCF8591) 思路:(66,两个地址0x90…

RNA-seq——上游分析练习2(数据下载+trim-galore+hisat2+samtools+featureCounts)

目录软件安装新建文件夹一、下载数据二、质控过滤1.数据质量检测2.数据质量控制3.对处理后的数据再次QC三、序列比对1.hisat2比对2.flagstat检查一下结果四、featureCounts定量写在前面——本文是转录组上游分析的实战练习。主要包含四个步骤: 数据下载&#xff08…

DockerCompose编排Redis6.2.6以及遇到的那些坑

场景 Docker中使用Dockerfile的方式部署SpringBootVue前后端分离的项目(若依前后端分离框架为例): Docker中使用Dockerfile的方式部署SpringBootVue前后端分离的项目(若依前后端分离框架为例)_霸道流氓气质的博客-CSDN博客_若依 dockerfile 在上面使用Dockerfile分别构建每个…

Heron‘s formula

In geometry, Heron’s formula (or Hero’s formula) gives the area A of a triangle in terms of the three side lengths a, b, c. If {\textstyle s{\tfrac {1}{2}}(abc)}{\textstyle s{\tfrac {1}{2}}(abc)} is the semiperimeter of the triangle, the area is,[1] {\d…

影视中学职场套路——《如懿传》中职场生存法则

目录 一、老板决定的事,赞成不赞成都要执行 二、居人之下,聪明劲儿别往外露 三、切忌大庭广众直接与上级冲突 四、取悦所有人,不如取悦最大的boss 五、再强的人,也需要团队作战 六、人善被人欺(首先要自保&#…

第三十一章 linux-模块的加载过程一

第三十一章 linux-模块的加载过程一 文章目录第三十一章 linux-模块的加载过程一sys_init_modulestruct moduleload_module模块ELF静态的内存视图字符串表(string Table)HDR视图的第一次改写find_sec函数ps:kernel symbol内核符号表,就是在内核的内部函数…

opencv图像去畸变

图像去畸变的思路 对于目标图像(无畸变图像)上的每个像素点,转换到normalize平面,再进行畸变变换,进行投影,得到这个像素点畸变后的位置,然后将这个位置的源图像(畸变图像)的像素值作为目标图像…

Visual Studio 2022安装与编译简单c语言以及C#语言(番外)

文章目录1 软件下载网站2 下载与安装3 创建并学习C语言4 创建并学习C#语言1 软件下载网站 Visual Studio官网 2 下载与安装 1、下载社区版即可。 2、下载得到安装文件,右键以管理员方式运行安装文件。 3、点击继续。 4、等待下载完成。 5、这里学习C选择使用…

SpringBoot文件上传同时,接收复杂参数

目录 环境信息 问题描述 错误分析 解决方法 简单参数 总结 环境信息 Spring Boot:2.0.8.RELEASE Spring Boot内置的tomcat:tomcat-embed-core 8.5.37 问题描述 收到文件上传的开发工作,要求能适配各种场景,并且各场景的请求…

C语言——操作符详解(上)

C语言——操作符详解(上) 操作符的分类 C语言中的操作符主要分为算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员。我将分成三篇文章为大家详细介绍以上所…

[附源码]Python计算机毕业设计Django网约车智能接单规划小程序

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

[附源码]Python计算机毕业设计华夏商场红酒管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等…

AI绘画火爆,以昆仑万维AIGC为例,揭秘AI绘画背后的模型算法

AI绘画火爆,以昆仑万维AIGC为例,揭秘AI绘画背后的模型算法 一、前言 最近AI绘画让人工智能再次走进大众视野。在人工智能发展早起,一直认为人工智能能实现的功能非常有限。通常都是些死板的东西,像是下棋、问答之类的&#xff0…

mysql锁范围(一)表级锁变行级锁

文章目录行级锁1. 用两个连接connection登陆mysql2. 测试无索引情况1)机器1开启事务,执行更新北京仓数据sql,不提交事务2)机器2开启事务,先查询北京仓3)机器2开始更新上海仓数据4)机器1事务回滚…

【Spring Cloud】Nacos服务分级存储模型与负载均衡原理与实战

本期目录1. 服务分级模型介绍2. 服务分级模型的必要性3. 配置集群属性4. NacosRule负载均衡4.1 背景描述4.2 配置Nacos负载均衡策略4.3 根据权重负载均衡1. 服务分级模型介绍 为了提升整个系统的容灾性,Nacos 引入了地域 (Zone) 的概念,如上图中的北京、…

Reactor 和 Proactor 区别

Reactor 和 Proactor 区别 同步异步、阻塞非阻塞组合 同步 以read()函数为例,int n read(fd, buf. sz) 当采用同步的方式和阻塞io的方式时,buf就是从内核拷贝的数据,函数返回则可以马上知道 buf 中的数据。当采用同步的方式和非阻塞io的方式…