一面
先问了项目。关注了商秀app问题:
Q:后台是如何将所有模板和实际图片作比对的。
A:是用类似LRUcache的方式。最近访问的放队头。然后逐一比对。
然后问了Java相关的:
Q:你对多线程并发编程了解多少?
A:核心是通过锁的思想解决并发情况下的问题,乐观锁(其实不是加锁),悲观锁(真正的加锁)。回答了synchronized,violate 这俩关键字。回答了线程的几种状态。wait和sleep的区别。
Q:什么是线程池?
A:描述了使用场景,以及动态扩展,以及释放。
Q:topK问题及其优化。
A:如果数据量大,先Hash分堆。在每堆内部利用小根堆计算topK,再reduce合并。
Q:follow up,K很大,不适合分堆?
A:利用快排的思想,一次减少flag一边的数据。
Q:推算快排法和小根堆法的复杂度各是多少?
A:快排法平均logN,小根堆NlogK。推算。。。
Q:快排的优化?
A:针对顺序,逆序,可以使用类似三选一的方法找flag。针对重复数组,记得是可以先将重复集中,再排。没有回答好。待查。(应该是先将与flag相等的元素聚集)
编程题:堆排序。
出现的问题:计算下标要注意。建堆的时候从len/2开始 i-- 调用adjust。而插入的时候是从0开始调用。adjust函数的退出条件没写好:1,无左子树(,一定无右子树,直接return)2,无右子树(若左子树大于根,return)3,都有且都大于根,return。
二面
Q:Spark中用过xx没有?
A:没有。GG
Q:简历里的学习项目autoComplete是词内还是词间?具体怎么做的,流程是什么。
A:词间。job1:先对line做分割,然后对2gram 3gram 4gram词组统计词频。job2:先计算块儿内统计次数,计算概率。再累计次数和重写计算概率(被嘲笑太简单了)
Q:虚基类和接口的区别与联系。
A:都是为了实现抽象定义。虚基类是通过继承,只能继承一个,必须实现所有非虚函数。而一个类可以继承多个接口。
Q:简述Java的类加载机制?
A:讲了下双亲委派,及其作用。提到了判定类相等的两个条件:类名&&类加载器。
Q:比较对象重写对象equals方法时,还必须重写什么?
A:经提示,如果对象需要放入集合类,那么就要考虑Hash值,所以要重写HashCode。
Q:针对决策树,SVM,K-means三个算法,哪些可以无监督,哪些对尺度变化不敏感,哪些。。
A:K-means无监督,决策树对尺度变化不敏感。
Q:SVM核函数可以拿来做什么?
A:利用多项式展开,解决在当前维度下的线性不可分。
Q:如何对ipv4的地址进行压缩编码。
A:针对ipv4的四个字段,每个字段都是0-255,可以用8bit编码,一共32bit,实际上可以用一个int来存储编码。