1. 哈希切分
哈希切分就是将一个大文件,利用哈希的原理,将其分为若干个小文件。相同的数据都被分到同一个文件里。例如我有一个存放着100亿个整数的大文件,将其分为100个小文件。将每个数都模100,结果相同的数存放到一个文件里。因为相同的数模100的结果是一样的。这样就非常方便遍历。
2. 位图(BitMap)
位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。
3. 布隆过滤器(Bloom Fileter)
4. 哈希表5. 堆
面试题一:给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址。
100G的文件普通机器内存中肯定是放不下的,所以我们就要找其他的方法来解决这个问题。这些IP地址相当于一个32位的字符串,这么大的文件,我们可以考虑切分,但光切分还不行,假设有1G可用的内存,那我们切分成100份,那还得把这100个文件全部遍历一遍,把每一个出现的IP都统计一下次数,最后找到出现次数最多的IP,这是一种方法,但是效率太低。我们还有没有其他的方法,有,那就是Hash分桶法。把这32位的IP通过字符串哈希函数转化成对应的整形,把100G文件分成1000个,从硬盘中读取这些IP,转化成整形后对文件个数取余,余数是多少就放进哪个文件里,这样就保证相同的IP一定是在同一个文件里。分好之后去统计每个文件里出现次数最多的,问题就转化成找这1000个IP出现次数最多的一个。这样问题就解决了。
面试题二:与上题条件相同,如何找到top K的IP。
看到这个题目大家一定会想,那就继续用Hash分桶法,这其实是不对的,因为这样的结果是,可能一个文件里IP的最多才10次,而另一个文件里IP最少的就有100次,这不就出问题了嘛。所以我满要想其他的方法,我们可以统计这些ip的次数,建一个小堆就可以找出前K个最多的。记住一定要建小堆。
面试题三:给定100亿个整数,设计算法找到只出现一次的整数。
100亿整数内存肯定放不下,整数范围是0到42亿多,所以,这100亿里一定有很多重复的数字。首先我们想到的就是切分,切到内存中能放下,然后遍历去找。这样做可以但是效率太低,我们可以考虑用位图来解决这个问题。位图一般是用1个位来表示数存在或者不存在,这里它找只出现1次的,所以用两个位来表示,两个位就是4个状态,我们只使用3个状态就好,分别是不存在,出现1次,出现多次,用两个位表示一个数,42亿个数位图只需要开1个G左右。
面试题四:给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集。
文件太大内存放不下,我们可以想到切割,把A文件切分成100份,拿B文件去比对。这样做可以,但是太慢了。
其实这个题也可以用Hash分桶法来做, 100亿个整数分到1000个文件里,每个数对1000取余,放到余数对应的文件里。两个文件都经过哈希分桶后,只需要对比编号一致的文件,因为哈希分桶保证了大小相同的整数一定分到同一个文件里。
今天就先到这里,下次还有别的大数据题分享。