海量数据问题



虽然做了笔记,但还老是忘,因为不常使用吗?


1. 海量数据处理

常见的问题如下:


10亿篇文章,如何找出其中出现次数最多的100个词(Trim树)

10亿个数字,取最小的100个数(Top K)

在2.5亿个整数中找出不重复的整数(重复问题)

两个大文件,找出交集?(利用Top K问题,使用相同的hash函数分片,那么相同的数据会被分到相同的片段)



2 Top K 问题

10亿个数字,找出现次数最多的一个或多个


(分治 + hashmap + 排序)

  • 把数字Hash(num)%1000值,存储到1000个小文件中
  • 每个小文件,构建HashMap(num,times),同时记录当前出现次数最多的num(多个时,就记录多个)
  • 得到1000个小文件中的出现次数最多的num,再依据常规的排序算法得到总体上出现次数最多的num

(堆排序,先排前n个,然后遍历所有数字)

  • 堆排序(nlogN)

(partition算法,经常二者比较,缺点为:内存没那么大,适合小数据)

  • O(n),S(1),但是需要改变输入的数组(就是快排思想)


2 不重复/去重问题

10亿个数字中找不重复的


(分治+hashmap+排除重复的)

  • 把数字Hash(num)%1000值,存储到1000个小文件中
  • 每个小文件后见HashMap(num,times),构建完就遍历去除次数超过1的
  • 得到1000个小文件不重复的数字

(bitmap自动去重)

  • 构建bitmap,用两个位表示一个数字。出现一次就设置为01,10表示多次,那么最后取出01的标示即可


3 中位数

10亿个数快速寻找中位数


  • 内存足够:排序。。。
  • 内存不够:分桶法(将数字看成二进制,看二进制第一位数字,将数字分成正负两个文件保存,假设file1存整数有6亿个,file0存负数有4亿个,那么中位数在file1上,依次类推)


原文地址:https://www.cnblogs.com/Howlet/p/13175648.html