大数据算法面试题

本文参考https://blog.youkuaiyun.com/woainimax/article/details/78208651并对部分内容进行了整理

1、给定 a、b 两个文件,各存放 50 亿个 url,每个 url 各占 64 字节,内存限制是 4G,让你找出 a、b 文件共同的 url?

1) 可以估计每个文件安的大小为 50G×64=320G,远远大于内存限制的 4G。所以不可能将其完全加载到内存中处理。考虑采取 分而治之 的方法。

2) 遍历文件 a,对每个 url 求取 ,然后根据所取得的值将 url 分别存储到 1000 个小文件(记为 )中。这样每个小文件的大约为 300M。

3) 遍历文件 b,采取和 a 相同的方式将 url 分别存储到 1000 个小文件(记为 )。这样处理后,所有可能相同的 url 都在对应的小文件( )中,不对应的小文件不可能有相同的 url。然后我们只要求出 1000 对小文件中相同的 url 即可

4) 求每对小文件中相同的 url 时,可以把其中一个小文件的 url 存储到 hash_set 中。然后遍历另一个小文件的每个 url,看其是否在刚才构建的 hash_set 中,如果是,那么就是共同的 url,存到文件里面就可以了。

思考:如何保证a/b生成的小文件根据url一一对应?如果不能保证,第4)步时,加载a生成的一个小文件到内存中,需要和b生成的所有的小文件都做一次遍历比较。

2、有 10 个文件,每个文件 1G,每个文件的每一行存放的都是用户的 query,每个文件的 query 都可能重复。要求你按照 query 的频度排序。

1)如果重复记录比较多,可以在内存中生成一个hashmap,以query为key,然后依次读取文件记录,将对应的key值的value +1计数,最后再根据value值排序即可。

2)如果重复记录较少,可以采用分而治之的方法。对原有的每个文件分别排序(如果1G对于内存来讲仍然偏大,可以继续分割文件),文件内部排序后,再利用归并排序,合成一个大文件,做到整体有序。

3、在 2.5 亿个整数中找出不重复的整数,内存不足以容纳这 2.5 亿个整数。

方案 1:

采用 2-Bitmap(每个数分配 2bit,00 表示不存在,01 表示出现一次,10 表示多次,11 无意义)进行,共需内存 内存,还可以接受。然后扫描这 2.5 亿个整数,查看 Bitmap 中相对应位,如果是 00 变 01,01 变 10,10 保持不变。所描完事后,查看 bitmap,把对应位是 01 的整数输出即可。

方案 2:

也可采用上题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素

4、海量数据分布在 100 台电脑中,想个办法高校统计出这批数据的 TOP10。

1) 在每台电脑上求出 TOP10,可以采用包含 10 个元素的堆完成(TOP10 小,用最大堆,TOP10 大,用最小堆)。比如求 TOP10 大,我们首先取前 10 个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是 TOP10 大。

2) 求出每台电脑上的 TOP10 后,然后把这 100 台电脑上的 TOP10 组合起来,共 1000 个数据,再利用上面类似的方法求出 TOP10 就可以了。

5、1000 万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?

内存放的下的话,直接在内存中使用hash_map即可进行去重。

内存放不下的话,先查分成小文件排序,最后合成一个有序的大文件。对于有序的大文件,可以每次读取两条记录进行比较,依次读完整个文件即可去除重复。

6、最大间隙问题。

给定 n 个实数 ,求着 n 个实数在实轴上向量 2 个数之间的最大差值,要求线性的时间算法。

使用位图。第一遍扫描n个数据,将其对应的位图中的位置,位图的索引值等于对应的实数值。第二遍扫描,依次计算有值的位图索引的差值,取最大的那个即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值