【大数据】常见面试海量处理题目
作者:互联网
常见海量处理题目
常见海量处理题目解题关键:
- 分而治之。通过哈希函数将大任务分流到机器,或分流到小文件(很像Map-Reduce)
- 常用的hashMap或bitmap
难点在于:对时间和空间的控制。下面都会用到分而治之,和借助hashmap和bitmap
例题1:请对10亿个IPV4的ip地址进行排序,每个ip只会出现一次。
解析:IPV4的ip数量 约为42亿。
方法一:
先将ip转化为4字节的无符号整数,但是10亿个地址需要转化为10亿个整数(每个整数4字节,空间为4G)
总结:没必要申请这么大的空间,对空间浪费极大
方法二:申请长度为2^32的bit类型的数组(bitmap)。
每个位置上是一个bit,只可表示0或1两种状态。长度为2^32次方的bit数组,空间约为128M。若出现一个整数k,在bitmap中将对应的位置的0改为1,记做出现过。然后从0位置遍历,把ip通过位置值还原,就完成了对ip地址的排序。
例题2:有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数。但是内存限制只有2G
方法一:hashmap记录所有数出现的次数。(key:具体某一个数 value: 这个数出现的次数)
key整形4个字节,value整形4个字节。 一条记录(key,value)占有8个字节。当记录条数为2亿时(也就是平均一个数出现10次),大约1.6G内存。若是20亿个数据都不一样的话,会导致内存不足。
方法二:利用哈希函数对20亿个整数的大文件进行分流,分流成不同的小文件。
同一种数不会被分流到不同的文件,这是哈希函数性质决定的。对于不同的数,每个文件中含有整数的种数也是几乎一样的,这也是哈希函数性质决定的。
所以对这个大文件分成16个小文件,保证每一个小文件的hashmap不会超过2G。对每一个小文件进行hashmap统计,得到每一个小文件各自的第一名,再选出最终的的第一种
例题3:32位无符号整数的范围是0~4294967295。现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然有没出现的树。可以使用最多10M的内存,只用找到一个没有出现的数即可,如何找?
方法一 : 使用hashmap记录出现的所有数
用哈希表来记录所有的数,最差的情况下,将出现40亿个不同的数。每一条记录占4个字节,大约需要16G内存。明显超出10M的内存。
方法二: 使用bitmap
申请一个2^32次方的bitmap数组,和例一一样,但是大约需要500M的空间,不符合要求。
方法三:0~4294967295(2^32-1)划分成64个区间,统计每个区间上没出现的数
单个区间应该装2^ 32/64个数,但是这个文件只包含40亿个数,说明必然有区间计数不足2^ 32/64个。单独关注这个区间个数小于区间大小的区间,假设关注的是第n(n : 1-64)个区间,在遍历一遍40亿个数,并用bitmap统计区间n上的数出现情况。占用差不多500M/64 = 8M空间。就可以找到没出现的数。
总结:
- 根据内存限制决定区间大小(500M/10M = 50, 分大于50个的空间),根据区间大小,得到有多少个变量,来记录每个区间的数出现的次数。
- 统计区间上的数的出现次数,找到不足的区间(区间个数小于区间大小,则肯定有没出现的数)。
- 利用bitmap对不满的区间,进行区间上的统计。
标签:文件,题目,海量,32,bitmap,面试,亿个,ip,区间 来源: https://blog.csdn.net/weixin_43939593/article/details/104878786