结合网上面试的实例,下面分三种情况考虑:参考BitMap 详解、算法系列-大数据面试题-两个大文件中找出共同记录

**情况一、**有40亿个无序int类型的整数,再给一个新的整数,我需要判断新的整数是否在40亿个整数中,你会怎么做?

解法一、最常规直观的解法,就是使用一个HashSet,将所有数都add进去,然后对要判断的数,执行一下contains函数判断下就ok了。
但是这个HashSet会占用多少内存呢?

40亿*4Byte=40亿*4/1024/1024/1024G=14.9G空间

这需要一个很大的内存空间来处理,那么如果只有2G的内存空间呢?

解法二、BitMap
我们申请一个Bit数组,数组的每个元素,都能表示0或者1,数组的长度为2^32。
由于一个整数占4字节,所以一个无符号整数,取值范围是0 ~ (2^32 - 1)。
因此,对于40亿整数中的任何一个数,都可以对应放进这个数组里面。

例如:假设40亿的整数分别为 4,7,1,5,9 …
然后,对于40亿中的每个整数,我们都将这个整数作为下标,把数组中对应的位置为1。

而这个数组占用的空间大小为:

2^32 Bit = 2^32 (Bit) / 8 (Byte) / 1024 (KB) / 1024 (M) = 512M

这时,我们想要判断一个整数是否在这40亿整数中,我们只需要直接在数组中,取该数字下标的值。
对于该问题,利用BitMap,我们可以将计算时,近15G的空间占用,变成512M。而时间复杂度不变,依然是O(N)。

情况二、有两组40亿的整数,分别求出这两组数的交集和并集
类似上述解法二、构建两个BitMap,直接进行按位与按位或操作。这样只需要512M*2的空间。也是可以接受的。

情况三、给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
hash+分治思想

(1)首先我们最常想到的方法是读取文件a,建立哈希表(为什么要建立hash表?因为方便后面的查找),然后再读取文件b,遍历文件b中每个url,对于每个遍历,我们都执行查找hash表的操作,若hash表中搜索到了,则说明两文件共有,存入一个集合。
(2)但上述方法有一个明显问题,加载一个文件的数据需要50亿*64bytes = 298G远远大于4G内存,何况我们还需要分配哈希表数据结构所使用的空间,所以不可能一次性把文件中所有数据构建一个整体的hash表。
(3)针对上述问题,我们分治算法的思想。

**step1:**遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,…,a999,每个小文件约300M),为什么是1000?主要根据内存大小和要分治的文件大小来计算,我们就大致可以把298G大小分为1000份,每份大约300M(当然,到底能不能分布尽量均匀,得看hash函数的设计)

**step2:**遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为b0,b1,…,b999)(为什么要这样做?
文件a的hash映射和文件b的hash映射函数要保持一致,这样的话相同的url就会保存在对应的小文件中,比如,如果a中有一个url记录data1被hash到了a99文件中,那么如果b中也有相同url,则一定被hash到了b99中)
所以现在问题转换成了:找出1000对小文件中每一对相同的url(不对应的小文件不可能有相同的url)

**step3:**因为每个hash大约300M,所以我们再可以采用(1)中的想法

大数据求交集和并集处理相关推荐

  1. python中交集并集用什么符号表示_Python实现两个list求交集,并集,差集的方法示例...

    本文实例讲述了Python实现两个list求交集,并集,差集的方法.分享给大家供大家参考,具体如下: 在python中,数组可以用list来表示.如果有两个数组,分别要求交集,并集与差集,怎么实现比较 ...

  2. 大数据求签,人工智能算命,技术革新下传统行业还有灵魂吗

    都知道,未来社会是数字化的时代,但最近网上涌现了各类颠覆人们认知的数字化方案. 今天,小编在朋友圈看到一张图.内容如下: 网友评论:IoT不仅接地气,还可以接地府 当然,这样的案例也就图一乐.不过,关 ...

  3. Linux 两个文件求交集、并集、差集

    Linux 两个文件求交集.并集.差集 原文地址: Linux 两个文件求交集.并集.差集 (https://www.cnblogs.com/molong1208/p/5358509.html) 一. ...

  4. 对集合进行求交集、并集、差集

    对集合的元素进行计算操作 交集:求两集合相同元素 并集:求两集合全部元素(即用addAll()) 差集:求一个集合中剔除另一个集合所剩下的元素.(即用removeAll()) public class ...

  5. java 交集_Java大集合求交集的方法比较

    两个List集合求交集想必学过Java的都知道用系统自带的retainAll()方法,但是在数据量比较大时,这个方法效率并不高,利用空余时间研究了几种数据量较大时求两个集合交集的办法.本文主要研究了J ...

  6. 【分享】Java集合求交集、并集、差集

    面试场景: 之前遇到一个长得很有趣的面试官问两个集合怎么求他们的交集.并集.茶集,回答之后觉得非常有意思,在这里记录一下: 概念说明 一.交集 交集:两个集合的公共(相交)部分,如下图: 代码案例: ...

  7. ES6 使用数据类型Set求交集、并集、差集

    前言 ES6新增了数据类型Set,它是一种类似数组的数据结构.但它和数组的不同之处在于它的成员都是唯一的,也就是说可以用来去除数组重复成员. Set本身是一个构造函数用来生成Set数据结构. cons ...

  8. Java求交集、并集、差集

    public static void main(String[] args) {Set<Integer> set1 = new HashSet<>();Set<Integ ...

  9. javascript 数组求交集/差集/并集/过滤重复

    最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.protot ...

  10. python 对中文文件求交集、并集、差集

    核心内容: 1. set模块 intersection() ,union(), difference() 函数的使用 2. 文件格式:一行一词, uft-8 3. 解决中文以str读入后转成list ...

最新文章

  1. 看我是怎样让客户更快找到我的!
  2. 90 亿美元的“Java 第一版权案”终落幕:谷歌胜,甲骨文败!
  3. 高等应用数学问题的matlab求解汇总
  4. 高等数学:第八章 多元函数微分法及其应用(3)方向导数 梯度 多元函数的极值
  5. 标准库 - 输入输出处理(input and output facilities) lua
  6. linux下获取系统时间的方法
  7. SQLServer之PRIMARY KEY约束
  8. 去除内存上的警告,避免程序崩掉
  9. Mac安装CentOS7
  10. python质量转换程序,Python库的文件转换成MP3和设置它们的质量
  11. 【王道计组笔记】储存系统(1):基本概念
  12. oracle附加数据库拒绝访问,Windows 添加任务计划报“0x80070005: 拒绝访问”的解决...
  13. 一些可视化Javascript插件
  14. matlab中小波工具箱,matlab小波分析工具箱使用教程
  15. 急救: Autodesk MapGuide Studio - Preview在MapGuide Open Source环境不能进行中文标注
  16. Python基于Django的汽车维修保养系统(源码调试+讲解+文档)
  17. 百度之星2017 HDU 6114 Chess 组合数学
  18. 基础破解XP/Win 7开机密码方法(粘滞键漏洞)
  19. qq计算机无法启动程序丢失MS,Win10无法运行QQ怎么回事 QQ提示缺少MSVCR100.dll解决方法...
  20. windows server 2008磁盘管理

热门文章

  1. 智遥工作流为Sap报工时(实例)
  2. Body estimation 代码复现之:结合 keras 对 Stack Hourglass 网络架构分析(全网最详细分析)
  3. Diskpart 工具个人总结
  4. 【Day2.2】海边行宫忘忧宫——“爱与希望”之宫
  5. C -- OC with RunTime
  6. 带你通关全栈树型结构设计:从数据库到前端
  7. Vue3.x 深入浅出系列(连载三)
  8. 金融贷款逾期的模型实现(二)
  9. 两波形相位差的计算值_国际学科备考系列A-level物理:相位和相位差的数学解释及物理应用...
  10. 使用TextMeshPro实现打字机效果