zoukankan      html  css  js  c++  java
  • 人人数据挖掘实习生面经

        之前投了人人的数据挖掘实习生。其实也不是很想去,就是想去体验体验,看看他们在数据挖掘这方面都在做什么。约好的面试时间是10:30。人人的办公地点在静安中心,就在北三环上,从学校坐车比较顺,367到终点站就到了。 

         一面的面试官是个比较青涩的gg,估计也就刚毕业1-2年。首先问了简历上的项目。然后就是算法题:给定一个二叉树,找到他第k层的第m个节点。我想了会,提了个用队列在层次遍历二叉树,然后存储每个节点的level,找到第k层的第m节点就停止。面试官就让我写,代码写完后给他看了看,他看的过程中又发现了自己new的内存忘记释放的问题,赶紧说了。他看了代码觉得没问题,但是觉得我在二叉树上又封装了个struct,存储level有点多余,问我可不可以直接使用二叉树的节点。我想了一会没想到好办法,他就跟我解释了一通,我没听懂,但是还是装作听懂了。

          接着就是二面,面试官上来感觉就像没睡醒一样,我顿时觉得这是个大牛。他先问了我了解不了解hadoop,我说hadoop了解的不多,但是知道map-reduce。他就让我解释下map-reduce。我解释完。他问了我一个问题: 比如他们会用人人注册用户的姓氏作为key,因为某些姓氏特别的多,会导致某些reduce分配到的数据特别的多,问我怎么解决这个问题。我想到了阿里云用的luban库,就说了下,但是说完才意识到luban是解决map阶段分配不均匀的,不是解决reduce阶段分配不均与的。面试官一看我答的不着边了,就说hadoop本身有一个机制解决这个问题,就是将某些key分配到不同的reduce上,然后对这些reduce再做一次reduce.然后问了两个算法题: 1.一个数组,有整数,有0,有负数。如何找到三个数使其绝对值最小。我先说了复杂度为O(n3)的算法。然后自己又想到一个方法。就是先对数组排序,然后两个指针分别指向数组的头和尾,根据这两个数计算最佳的第三个数。如果第三个数比最小的数还小,那么数组尾的指针向后移,如果第三个数比最大的数还要大,那数组头的指针向指,如果第三个数正好在数组范围内,就选择最接近第三个数的数。时间复杂度为O(nlgn),说的思路挺混乱的,面试官觉得这种想法很新颖,但是不知道能不能求得这个三个数。问题2: 如何打印出一个集合的所有子集。我先说了可以用暴力破解法递归。然后面试官提示我不一定要用递归。我就想到了以前在白书中看到的二进制法。就是用一个数的二进制表示集合,位置为1表示这个集合没有这个元素。反之就有。面试官表示同意。

          二面后就到了吃午饭时间。面试官就把我送出去,路上问了我可以入职的时间。

          回来百度了下,发现自己二面第一题想出的方法有问题,但是指针移动的思路还是正确的。贴出来二面两道题的解法:

    面试题1:

    算法解析:
    解法一:枚举3个数,O(N*N*N)

    解法二:对S排序后枚举其中2个数,二分查找另一个数。O(N*N*LOGN)

    解法三:对S排序后枚举其中1个数X,使用双向指针i,j从数组两端更新(注意剔除X)。根据S[I]+S[J]+X的正负号来更新I或J。若为负则I++,否则J--。一旦和为0即退出。同时根据每次得到的和来更新best。最后best即为所求。利用三个变量X,Y,Z记录,可得到任一最优解。复杂度O(N*lOGN+N*N)=O(N*N)

    面试题2:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 void print_subset(int n, int s) 
     5 {
     6     for(int i = 0; i < n; i++)
     7         if(s&(1<<i))
     8             printf("%d ", i);
     9     printf("\n");
    10 }
    11 
    12 int main()
    13 {
    14     int n = 5;
    15     for(int i = 0; i < (1 << n); i++)
    16         print_subset(n, i);
    17 
    18 }

    关于hadoop数据倾斜的问题:

    常见的mapreduce分区方式为hash 和range ,

    hash partition 的好处是比较弹性,跟数据类型无关,实现简单(设定reduce个数就好,一般不需要自己实现)

    range partition 需要实现者自己了解数据分布, 有时候需要手工做sample取样. 同时也不够弹性, 表现在几个方面,1. 对同一个表的不同字段都需要实现不同的range partition,  对于时间这种字段根据查询类型的不同或者过滤条件的不同切分range 的大小都不一定.

  • 相关阅读:
    判断操作系统多久没有任何操作
    初识类的方法
    类引用
    将窗体显示在 PageControl 上。
    用批处理命令安装打印机
    减小Delphi2010程序的尺寸(关闭RTTI反射机制)
    Delphi 的编码与解码(或叫加密与解密)函数
    c# 让repeater多列显示
    合并动态数组
    [最新]Visual Assist X 破解版下载(10.6.1827)
  • 原文地址:https://www.cnblogs.com/iamccme/p/3093371.html
Copyright © 2011-2022 走看看