首先分析几道看似相似解法不同的面试题:
一、 题给两个⽂文件,分别有100亿个整数,我们只有1G内存,如何找到两个⽂文件交集!用近似法和精确法来处理。
二、给两个⽂文件,分别有100亿个字符,我们只有1G内存,如何找到两个⽂文件交集!用精确法和近似法来处理。
1)题目给有内存大小限制,所以打消直接存储的方法,当然也不现实。
2)有存储整数和存储字符的限制,所以处理方法也不同。
3)要找到两个大文件的交集,首先想到的是逐次比较,但太耗时间,因此就想到位图,哈希,文件分割。。。。
这里先给出第一题的解法:
可以采用位图来解决,位图就是就在整数范围内使用,速度快,存储效率高,但其缺点是只能近似表示一个数存在或者不存在,并不能表示其出现了多少次
第二题与第一题相比较,还是略微要麻烦些,首先100亿个字符占内存10*10G,用文件切分成一百组,每组放hash表内相当于40亿个字节需要4G存储空间,一次和另一文件近相比较,时间复杂度O(n*n)另一方法是,将两个文件个分成1000组,读一个文件一个字符串将其转换换为整型%1000,放入A1,另一文件放入B1,同样方法,逐个判断,时间复杂度O(n),因为相同的字符串会出现在同一小文件里
1)给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?!
解决方法
将100G文件分成100份,将每个ip转型%100映射到相应小文件中 ,每一个相同的IP会进入同一个文件,
用哈希或位图统计每个小文件,统计次数,比较找出最多的一个
2)与上题条件相同,如何找到top K的IP?如何直接⽤用Linux系统命令实现?
解决方法
将100G文件分成100份,将每个ip映射到相应文件中 ip_if=ip%100
找出每个文件中的出现次数最多的k个ip,再将100份里找出来的最多的k个放入一个哈希表中或用位图进行比较找出最大的k 个
3)给定100亿个整数,设计算法找到只出现一次的整数!
解决方法类似
将100亿个数分拆成1000份文件,再将每份文件里使用位图,并用两位bit表示数字出现的4种次数,00存出现0次的数,01存放出现1次的数,10存放出现多次的数,11舍弃,再将1000份中出现一次的数全部合并到一个文件里存放即可
4)1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数!、
相同题型
将100亿个数分拆成1000份文件,再将每份文件里使用位图,并用两位bit表示数字出现的次数,00存出现0次的数,01存放出现1次的数,10存放出现2次的数,11舍弃,再将1000份中出现次数不超过二的数全部合并到一个文件里存放即可
5)给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?
算法和近似算法!
精确算法:
将两个文件分别存入相同哈希算法的1000个哈希桶(共两千个)文件,再在每个文件找出相同的query
近似算法:
因为文件可能大部分都是字符,所以不能用位图处理,即利用布隆过滤器进行比较
6)如何扩展BloomFilter使得它支持删除元素的操作?
将bloomfilter中每一位扩展成一个计数为,将原来用0或1表示不存在或存在,改为00表示无,01表示1,当每增加哦一个,计数加加,每删除一个,计数器减1,直到减为0为止,减到零则表示不存在,否则计数为几,就表示出现几次
7)
如何定义一个只能在堆上生成对象的类
将构造函数放在protected内
通过一个人静态成员函数来创建对象
8)给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存!
对上千个文件生成1000个布隆过滤器,并将1000个布隆过滤器存入一个文件中,将内存分为两份,一分用来读取布隆过滤器中的词,一块用来读取文件,知道将每个布隆过滤器读完为止
实现部分,待续。。。。