大数据面试题汇总

大数据量场景面试题

假设有10亿手机号,如何快算判断一个手机号是否再其中?

- 无符号整数表示范围 [0,1<<32] 1<<32 = 4294967296 bit = 512M 内存
- 40亿整数 将对应bit设置为1 接着读取要查询的数,查看相应位是否为 1,如果为 1 表示存在,如果为 0 表示不存在

如何再海量数据中找到高频词?

  • 有一个 1GB 大小的文件,文件里每一行是一个词,每个词的大小不超过 16B,内存大小限制是 1MB,要求返回频数最高的 100 个词
    • 解题思路:
      • 遍历文件 对每个字符进行哈希然后取余,拆分成小文件,每个文件均小于1M
      • 使用hashMap 进行每个小文件的出现次数统计,同时构建一个最小堆 堆大小为 100。 如果遍历到的词的出现次数大于堆顶词的出现次数 则用新词替换堆顶的词,然后重新调整为小顶堆,遍历结束后,小顶堆上的词就是出现频数最高的 100 个词
      • 再构建一个最小堆,分别将每个小文件的堆跟堆顶元素进行比较,比他大则替换

BitMap 原理?

  • 在java中,一个int类型占32个比特,我们用一个int数组来表示时未new int[32],总计占用内存32*32bit,现假如我们用int字节码的每一位表示一个数字的话,那么32个数字只需要一个int类型所占内存空间大小就够了,这样在大数据量的情况下会节省很多内存
  • 1个int占4字节即4*8=32位,那么我们只需要申请一个int数组长度为 int tmp[1+N/32]即可存储完这些数据,其中N代表要进行查找的总数,tmp中的每个元素在内存在占32位可以对应表示十进制数0~31,所以可得到BitMap表:
  • tmp[0]:可表示0~31
  • tmp[1]:可表示32~63
  • tmp[2]可表示64~95
  • 假设这40亿int数据为:6,3,8,32,36,

BitMap 应用?

  • 在3亿个整数中找出不重复的整数,限制内存不足以容纳3亿个整数?
    • 对于这种场景我可以采用2-BitMap来解决,即为每个整数分配2bit,用不同的0、1组合来标识特殊意思
      如00表示此整数没有出现过,01表示出现一次,11表示出现过多次,就可以找出重复的整数了
      需要的内存空间是正常BitMap的2倍,为:3亿*2/8/1024/1024=71.5MB
      扫描着3亿个整数,组BitMap,先查看BitMap中的对应位置,如果00则变成01,是01则变成11,是11则保持不变,当将3亿个整数扫描完之后也就是说整个BitMap已经组装完毕。最后查看BitMap将对应位为11的整数输出即可
  • 某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数?
    • 如果用 bit表示一个号码,那么总共需要1亿个bit,总共需要大约10MB的内存
    • 把遍历到的电话号码对应的位图中的bit设置为1。当遍历完成后,如果bit值为1,则表示这个电话号码在文件中存在,否则这个bit对应的电话号码在文件中不存在。
    • 最后,统计位图中bit值为1的数量,便能得到不同电话号码的个数
      img

那么如何确定电话号码对应的是位图中的哪一位呢?

img

posted @ 2024-04-17 17:17  贺艳峰  阅读(3)  评论(0编辑  收藏  举报