小米内推-搜索推荐算法岗一面,二面,三面面经
楼主非科班出身,一名小小的研究生(非985),数不清多少次的内推,没有一次给了面试机会,终于在8月30下午接到小米内推的预约周五,今天(9月1号)面试的电话。
刚刚结束了小米的一面,遂写下此面经,攒点人品。话不多说,我们开始。
一面:
1.自我介绍(一般套路)
我介绍了自己的研究方向,自己读研期间的项目以及实习经历。
2.介绍下你简历里面令你印象深刻的项目,为什么?
我说了一个实习经历,原因是真实场景,会遇到各种以前没见过的问题,balabala。。。
(期间会打断我,不断的问实习的时候做的事情,什么特征选择,特征的维度,用户和物品的数量)。
3.(开始问算法)说说线性回归
我结合逻辑回归基本讲了一下原理
4.问了xgboost(我实习的时候用过xgboost,所以写在简历上),问特征维度是1600,你一般建多少颗树,数的深度你怎么设置,以及其他的参数怎么设置?
我说我当时设置100颗树(具体我也忘了。。。因为当时实习的时候是leader把参数设置好让我去跑的),树的深度我回答50(回答完我就后悔了)
,面试官问:数的深度是50,你算算有多少结点(自己挖了个坑啊2^50-1,自己笑笑说可能记错了。。。尴尬)。
5.你了解JVM的参数设置吗,比如现在频繁出现GC,你应该怎么做?
我说出现GC可能是内存不够用,可以考虑把堆内存调大一点。
6.延伸第五个问题,你怎么调整内存中新生代和老年代的内存大小?
(其实我内心是奔溃的)我说新生代和老年代的比例不是固定的嘛?1:2.。。。(好吧,我对这块不熟悉)然后就过了。。。
7.HashMap和Hashtable和Map的区别
我从线程安全和是否容许null来回答的。
8.然后又问,Hashtable的线程安全你知道是怎么实现的嘛?
说真的,这题我真不知道怎么回答,我只是说了加了synchronized关键字。
9.你和我说说spark RDD吧
然后我从两大类的算子大致说了下RDD。
10.说了一个场景:现在我用spark跑一个逻辑回归模型程序,发现数据倾斜了,你怎么解决?
我说首先分析是否算子方面写的不合理,然后说如果是数据方面的原因,可以考虑对数据进行预处理,然后单独去处理这部分的会导致倾斜的数据。(中间打断了我一次,说,如果在跑程序的过程中,如果是数据出现的问题,你会停止然后重新做?我好直接说:会。。。不知道回答的对不对。。。估计是不是想考我rdd方面的知识,奈何不太熟悉)。
11.问我有什么想问的?
整个过程40分钟左右中间电话还断了一次,我问完两个问题,然后面试就结束了,都没说后面还有没有面试了,留下我一脸蒙蔽,心想挂了吧,回去写个面经吧。
还有其他的问题我就记不起来了,原因是,我在写面经的过程中,二面的电话来了,接下来是二面的面经。
===================================================================================================
二面:
1.自我介绍
我将刚刚那一套又说了一遍。。。实在不知道还有什么好说的。
2.说一下xgboost
我简单说了一下原理。
3.给我介绍下,推荐方面有那些算法
我大致将两类的推荐算法都说了。
4.我看你简历上写了fm,那你和我说说fm吧
我也简单说了下fm的思想。
5.现在给你一亿的用户,和一亿的物品,你怎么去做推荐?
说实话,当时听到这个问题的时候,我内心是拒绝的,心想:我在研究所里最多用的也不过是几万的用户几十万的物品,一亿你存心为难我吧。硬着头皮说,既然数据量这么大的话,是否可以先进行数据预处理,然后利用spark去做?我当时用的是问号,其实是希望面试官回答我的这个问题,结果他直接过了。。。
6.然后问我项目的事情,问我实习的项目,推荐系统的流程(当时我在实习的时候也是做得推荐)?
我将整个推荐的流程说了一遍,从数据的处理到数据的应用。
7.你在实习的时候,在召回的步骤用的协同过滤和ALS会不会出现一些效果不好的情况,然后你怎么分析的?
这个问题,我并没有回答,因为我确实没有参与召回策略那一块。只好说我没有参与,然后转向说目前业界这些基本的算法应该还是很好用的。
整个过程大概是15分钟,很短,结果二面面试官跟我说,你在我这儿ok,我来问问其他的同事,如果有三面,等会再联系你。
====================================================================================================
三面:
接到三面的电话,我还特意找了一个清净的地方,结果说要电脑,要写代码,我只好回到办公室。
1.你给我写一下链表的反转
我还特意问了下,时间复杂度和空间复杂度有什么要求?面试官说没有,这个还是很好写的,看过左神书的应该都会写这个,然后写了一个最优的。
2.你还有没有其他的方式来实现这个?
我说递归(说完我就后悔了。。。),面试官说你写一个递归的版本吧,好在网速不稳定页面刷不出来,然后就没写了,让我口述了一下。
说完,来了一句其实就是考考你递归。。。
3.你一般用java是吧,你对GC熟悉吗,给我说说GC的有几个算法并说下原理
我说了标记-清除,标记-整理,还有一个死活想不起来名字,然后说还有一个的原理是这样的,但我忘了叫什么名字。。。
4.JVM内存是怎么划分的?
答了堆内存从物理上可以分为年轻代和老年代
5.年轻代是否可以继续划分?
答了Eden区和Survivor区,然后两个的比例。
6.这个比例是固定的嘛?是否可以调整?
这个问题,我不知道,我记得是固定的8:1:1。。。然后问:这个比例可以调整吗?我没遇到过。。。
7.什么时候会触发年轻代的GC?
中间还有几个问题我忘了。。。
后面聊推荐,因为我的研究方向是推荐,所以聊天推荐的话还行,感觉和三面的面试官后面的时间不像面试,倒是像在交流。面完,同屋子里说,还以为你和谁讨论问题。。。
三面大概一个小时。
总结下:
1.无论结果怎么样,至少是秋招的第一场面试,对我这个内推好几家没有一家回复的人来说是一种安慰,感谢。
2.面试官貌似很在意你解决实际问题的能力,所以投机器学习或者数据挖掘的童鞋们,感觉要多模拟下实际的场景。
3.第一次写面经,写的不好,请大家指正。