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

算法通关村——海量数据场景下的热门算法题的处理方法

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

题目要求:给定一个输入文件,包含40亿个非负整数,请设计一个算法,产生一个不存在该文件中的整数,假设你有1GB的内存来完成这项任务。
● 进阶:如果只有10MB的内存可用,该怎么办?

1.1 哈希存储

最坏的情况是里面数据都存在,那么这个哈希表的记录数就是40亿,而一个整数占4个字节,也就是说哈希表记录数占据160亿个字节,大概是16G,很显然是超过了1GB,这种方法就不需要考虑了。但是如果转换成比特存储,1个字节等于8比特,空间就小了很多。

1.2 位图(bitmap)存储

但是如果使用位存储,需要申请一个长度为 4294967295 的 bit 类型的数组 bitArr(就是boolean类型),8 个bit 为1B,所以长度为 4 294 967 295 的 bit 类型的数组占用 500MB 空间,bitArr 上的每个位置只可以表示 0 或1 状态。只要存在这个数据那么就将这个数据状态设置为1,表示重复了,最后只需要找到元素下标为0的数,就是不存在的数,最好的情况就是只有极个别的数据不存在或者没有数据不存在,查找的速度也就提升了。

1.3 10MB存储

上面bitmap里面需要500MB空间,而这里只给10MB,意味着至少需要50块空间,而一般是使用2的倍数进行分块,所以这里可以使用64块来存储。

每一块里面的数据大小都是67 108 864个,只要遍历一次,就能统计每个区间内的元素个数,里面肯定有一个小于67 108 864,然后再bitmap映射,找到不存在的那个数。

2. 用 2GB 内存在 20 亿个整数中找到出现次数最多的数

题目要求:有一个包含 20 亿个全是 32 位整数的大文件,在其中找到出现次数最多的数。

2.1 哈希存储

一般统计个数使用哈希比较多,词频统计,每一个key都对应一个整数,假设没有重复的数,key的大小就是4b,value的大小也是4b,那么一条记录占用8b,20亿占用16G,超过了题目要求。

2.2 分块

2亿条记录是占用1.6G,我只需要将这个20亿数据分割10块,就能保证每一块的数据内存不会超过2G,接下来就是分别统计每一块里面出现最多的元素,将所有的块的次数进行比较找出最多的一条数据。

3. 从100 亿个 URL中查找的问题

题目:有一个包含 100 亿个 URL 的大文件,假设每个 URL 占用 64B,请找出其中所有重复的 URL。

这一题的思路根据前面几个题目相比也是很明显,依然是采用哈希存储,然后将这个大的哈希分成若干个小的文件,分别统计每一块里面的元素出现的个数。但是这里需要明确一下这个空间占用是多少,才能进行相应的分片。

http://www.lryc.cn/news/150602.html

相关文章:

  • 【C++从0到王者】第二十五站:多继承的虚表
  • 老程序员教你如何笑对问题,轻松培养逻辑思考和解决问题的能力
  • Omni Recover for Mac(专业的iPhone数据恢复软件)
  • 视频垂直镜像播放,为您的影片带来新鲜感
  • 十一、MySQL(DQL)聚合函数
  • C语言:三子棋小游戏
  • JAVA - PO DTO 生成器
  • tcpdump
  • 数据通信——传输层TCP(可靠传输原理的ARQ)
  • Compose - 交互组合项
  • 【发版公告】Virbox Protector 3.1.3.19051 发版- elf 文件支持导入表保护
  • 点云数据做简单的平面的分割 三维场景中有平面,杯子,和其他物体 实现欧式聚类提取 对三维点云组成的场景进行分割
  • C++之std::search应用实例(一百八十九)
  • 一文详解 requests 库中 json 参数和 data 参数的用法
  • Django学习笔记-AcApp端授权AcWing一键登录
  • 如何在小红书进行学习直播
  • F5服务器负载均衡能力如何?一文了解
  • Ubuntu18.04安装docker-io
  • 代码随想录笔记--栈与队列篇
  • 【力扣】55. 跳跃游戏 <贪心>
  • 在iPhone 15发布之前,iPhone在智能手机出货量上占据主导地位,这对安卓来说是个坏消息
  • 题目:2620.计数器
  • 【MySQL】MySQL系统变量(system variables)列表(SHOW VARIABLES 的结果例)
  • 【多AZ】浅述云计算多az
  • Element浅尝辄止13:Collapse 折叠面板
  • 51 单片机包含头文件 BIN51.H 直接写二进制数字
  • php环境搭建步骤(与资源配套使用版)
  • java 集合处理:
  • 算法训练第五十二天
  • LeetCode——回溯篇(三)