算法通关村-----海量数据的处理方法

2023-10-27

从40亿中产生一个不存在的数

问题描述

给定一个文件,包含40亿个非负整数,请你设计一个算法,产生一个不在该文件中的数字。假设你只有1GB内存。

问题分析

40亿整数,在java中,用int存储的话,大概需要40亿✖️4B,大约16G。现在只有1GB,很明显是不够的,可以考虑位存储,可以减少到原空间的1/32,大约0.5G,满足题目给定的内存要求

实现思路

使用位存储,使用整数对应位置的bit位为1,代表元素存在,为0,代表元素不存在。遍历这40亿个数,将存在的数对应的bit设置为1。对bit数组再次进行遍历,返回为0的第一个下标的对应数字即是40亿中不存在的数。

问题进阶

给定一个文件,包含40亿个非负整数,请你设计一个算法,产生一个不在该文件中的数字。假设你只有10MB内存。

问题分析

只有10MB来存储,很明显使用位存储是不够的。位存储需要0.5GB=500MB的空间。我们可以采用分块思想。一共需要500MB空间,我们只有10MB空间,可以分成50个块,一般向上取整至2的整数次幂,即64个块,40亿大概是4G,即4*2^ 30,总共2的32次方个数,分成64个块,每块2^32/64 = 2 ^26个数,我们可以通过两次遍历来找到不存在的数。

实现思路

首先,我们申请一个长度为64的整形数组,用于统计64个块中元素的个数。遍历这40亿个数,,判断其属于哪个块,可以通过数值大小%64来实现,统计结束后,找到一个数组元素小于2 ^26的对应块。在申请存储一个块元素所需要的bit空间,即2 ^ 26*4B/32 = 2 ^23B =8MB,小于10MB可以实现,遍历40亿个数,将属于该块的元素对应的bit为设置为1。对bit数组再次进行遍历,返回为0的第一个下标的对应数字即是40亿中不存在的数。

20亿个整数中找到出现次数最多的数

问题描述

在20亿个整数中找到出现次数最多的数,假设你只有2GB内存。

问题分析

20亿整数大概是2G=22^30 = 2 ^31,int类型可以存储,不会溢出。可以使map计数,键表示数字,值表示数字出现的次数,这样一个键值对需要8B的存储空间。20亿个数字需要大概2G8B=16GB。只有2GB的情况下,可以进行分块,分为8个块,依次进行处理。

实现思路

将20亿个数字映射为8个块,可以使用哈希函数(模8)来实现。统计每个块中元素的数量,找出最大值,比较八个块的最大值,找到20亿个数中的最大值返回。

总结

海量数据的处理方法通常只有三种,首先是特殊情况,让我们寻找海量数据中的最值,或者前几个最值,可以使用堆来实现,之后可以考虑bit位存储,整数存储对应下标,可以节省到1/32的存储空间,如果内存依旧不够,可以考虑分块,具体的分多少块,可以取需要内存和现有内存的比值,分块可以采用顺序分块,也可以采用哈希分块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法通关村-----海量数据的处理方法 的相关文章

  • redis 集群命令

    CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的所有节点 node 以及这些节点的相关信息 节点 CLUSTER MEET

随机推荐

  • 关于OriginPRO/Origin画图消锯齿以及平滑点与点之间的连接

    使用环境 蓝色粗体字为特别注意内容 1 软件环境 Win7 32 bit OriginPro 2018C 在使用Origin或者OriginPro画图的时候可能会遇到两个细节问题 1 曲线有锯齿 2 点与点之间的连线很尖锐 平滑 网上很多资
  • C++学习笔记day3

    继承 好处 减少重复代码 语法 class 子类 继承方式 父类 子类也称为派生类 父类也称为基类 继承中的对象模型 父类中所有的非静态成员都会被子类继承 利用开发人员命令提示工具查看对象模型 跳转盘符 C 跳转文件路径 cd 具体路径下
  • c语言程序 计算全班平均成绩,用c语言编写程序:计算班级每位学生的平均成绩。...

    匿名用户 1级 2011 01 08 回答 第一题 include stdio h float Grade float num int i 用来冒泡排序 num传入数组指针 i传入数组个数 int j k float temp for j
  • 初次使用GPU,遇到的一些cuda error及解决办法

    1 GPU RuntimeError CUDA error invalid device ordinal 解决办法 可能是在程序的多个地方都定义了使用的cuda编号 即使编号是一样的也会报这样的错误 解决办法是只保留一个 2 使用os en
  • nodejs是单线程还是多线程_node是多线程还是单线程?

    node是单线程的 采用单线程异步非阻塞模式 因为javascript引擎的关系 node默认是单线程 一个node js应用无法利用多核资源 Node js采用事件驱动和异步I O的方式 实现了一个单线程 高并发的运行时环境 而单线程就意
  • 汉诺塔问题(Hanoi)-python递归实现

    描述 描述 一 汉诺塔问题 有三根杆子A B C A杆上有N个 N gt 1 穿孔圆盘 盘的尺寸由下到上依次变小 要求按下列规则将所有圆盘移至C杆 每次只能移动一个圆盘 大盘不能叠在小盘上面 提示 可将圆盘临时置于B杆 也可将从A杆移出的圆
  • idea创建父子项目

    1 先创建父项目 左上角 file gt new gt project 然后选择 点击next Group和Artifact自己填写 Java Version 改成8 Name自己写 其他默认 然后next 这一步是添加依赖 我们只简单测一
  • Jenkins+基础系列16:番外篇--Manage and Assign Roles 角色权限控制插件

    1 下载插件 Role based Authorization Strategy 安装成功后 可以重启下 2 菜单查看 3 菜单简介 4 Manage Roles 设置 5 Assign Roles 设置 6 视图名称和job名称设置 由于
  • R语言 朴素贝叶斯分类预测

    朴素贝叶斯预测分类问题代码 install packages e1071 下载包 library e1071 加载包 classifier naiveBayes iris 1 4 iris 5 构建分类器 table predict cla
  • L1-040. 最佳情侣身高差

    专家通过多组情侣研究数据发现 最佳的情侣身高差遵循着一个公式 女方的身高 1 09 男方的身高 如果符合 你俩的身高差不管是牵手 拥抱 接吻 都是最和谐的差度 下面就请你写个程序 为任意一位用户计算他 她的情侣的最佳身高 输入格式 输入第一
  • JMETER入门_06_jmeter集合点

    JMETER入门系列 JMETER入门 01 环境配置 JMETER入门 02 基础知识介绍 JMETER入门 03 jmeter请求实例 JMETER入门 04 jmeter压力测试实例 JMETER入门 05 jmeter参数管理 ht
  • LeetCode【434】 字符串中的单词数

    题目 统计字符串中的单词个数 这里的单词指的是连续的不是空格的字符 请注意 你可以假定字符串里不包括任何不可打印的字符 示例 输入 Hello my name is John 输出 5 public int countSegments St
  • 深度强化学习系列(16): 从DPG到DDPG算法的原理讲解及tensorflow代码实现

    1 背景知识 在前文系列博客第二篇中讲解了DQN 深度强化学习DQN原理 可以说它是神经网络在强化学习中取得的重大突破 也为强化学习的发展提供了一个方向和基础 Sliver等人将其应用在Atari游戏中取得了重大突破 后来大批量的论文均采用
  • JavaScript 入门基础 - 变量 / 数据类型(二)

    JavaScript 入门基础 变量 数据类型 二 文章目录 JavaScript 入门基础 变量 数据类型 二 1 变量 1 1 什么是变量 1 2 变量在内存中的存储 1 3 变量的使用 1 4 变量语法扩展 1 4 1 更新变量 1
  • kettle配置资源库

    kettle 数据库资源库配置 在使用kettle过程中可以配置资源库 将建好的作业和转换都保存在资源库中 下次直接登录就可以看到所有保存的作业和转换 本教程使用kettle v8 2 mysql 5 7 24做演示 方法 步骤 前期准备工
  • C++五种排序方法(有参考)

    快速排序 堆排序 希尔排序 冒泡排序 选择排序 数据结构选择 数组 概要设计 定义一个容量为一亿个整数的数组 定义变量n 用rand函数生成n个随机数 并赋值给数组 用clock函数计算排序所用时间 编写排序函数和主函数 一 快速排序 in
  • gmpy2常见函数使用

    gmpy2常见函数使用 1 初始化大整数 import gmpy2 gmpy2 mpz 909090 result mpz 909090 2 求大整数a b的最大公因数 import gmpy2 gmpy2 gcd 6 18 result
  • 【Python_PySide2学习笔记(十三)】QMainWindow 和 QWidget 的区别(转载)

    QMainWindow 和 QWidget 的区别 转载 前言 此篇文章中介绍QMainWindow 和 QWidget 的区别 转载自 pyside2 系列之QMainWindow和QWidget 正文 1 QWidget QWidget
  • 多模数据库

    随着业务数据量不断增长的同时 数据结构也变得越来越灵活多样 数据不再局限于规整的结构化数据 半结构化 非结构化数据在数据域处理中的占比逐年上升 因此对不同模态的数据进行智能化数据处理的需求越来越迫切 中国信通院在数据库发展研究报告 2021
  • 算法通关村-----海量数据的处理方法

    从40亿中产生一个不存在的数 问题描述 给定一个文件 包含40亿个非负整数 请你设计一个算法 产生一个不在该文件中的数字 假设你只有1GB内存 问题分析 40亿整数 在java中 用int存储的话 大概需要40亿 4B 大约16G 现在只有