大数据处理

首先分析几道看似相似解法不同的面试题:

         一、  题给两个⽂文件,分别有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个布隆过滤器存入一个文件中,将内存分为两份,一分用来读取布隆过滤器中的词,一块用来读取文件,知道将每个布隆过滤器读完为止

   实现部分,待续。。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值