面试中常见的大数据问题主要有:对大数据进行去重,对大数据进行排序,取大数据的Top K等等。

大数据相关问题的花样数不胜数,但其根本考点是不变的——内存。

碍于内存的限制,不能对大数据进行一次性全部处理,所以首先想到的是分治处理,再合并。但怎么分治,需要好好琢磨,怎么合并,也需要好好琢磨。

分治法只是一种通用的方法,并不适用于所有情况。

1. 大数据去重

大数据去重的方案有很多,不同的题目采取的方案也会有些差异。

1.1 hash分组

大文件中存储着100G的 url 的数据,如何对其去重?

可以对 url 取hash,对 hash%100,即将所有 url 分进100个小文件中。重复的 url 一定会被分到同一个小文件中,再对小文件进行去重。

如果 hash 算法做的足够好,不同 url 的hash值肯定不同,再小文件中可以对哈希值进行去重。也可以通过 set 对url本身进行去重。

有一亿条信息,如何找出重复次数前10的信息?(忽略内存的限制)

扫描所有信息,设计一个hash函数(比如取信息的首字节、尾字节和中间任意一个字节作为hashcode),求信息的hash值,并放进散列表中,将key设计为信息字符串,value为重复字数。当有hashcode相等的信息时,比较一下,如果相同就将value+1,不相同就用链表存储。

之后遍历散列表,通过优先级队列,对value取Top K。

2. 大数据排序

如何从 1 亿个整数中找出 100 个最大的数?考虑内存

使用优先级队列(构建大顶堆),大小限制在100,遍历一次,即可找出前100大的数。

有10G整数数据,如何在2G内存的机器上对其进行排序?

先分治:将10G文件分成10个1G的文件,对其进行快排,得到10个已经排好序的小文件。

任取两个小文件,进行归并,每次归并1G的数据,即得到两个1G的数据文件,虽然是两个文件,但这两个文件是排好序的。

以此类推,每次归并排序1G的数据,即可将所有数据进行排序。