算法面试问题总结(重点准备)
1.Coding方面
剑指offer和leetcode(重点)
常见算法题总结
- 最长不重复子序列
- DP(01背包问题) edit sitance 问题
- 全排序(如果有重复数字呢)
- 最短路径算法
- 图论问题,最小割问题
- 二分法的扩展版本
- 快排,冒泡排序等相关排序算法
- 一个数组中有一个数字出现两次,找出来
- 判断一棵树是不是对称的
- 一维红黑树与平衡树的区别
- 二维四叉树、网格 优缺点
- 单链表相关插入、删除
- 无序大数组中找中位数 (快排)
- 链表逆序
- 随机数1-5,怎么生成随机数1-7
- 怎么判断链表是否有环
- 有序数组的交集,并集(搜索领域经常用)
- 数组中第一个大于等于K的数
- 判断麻将胡没胡(正则的状态机实现方式)
- 完全二叉树的下一个节点
- 有N个人,其中有一个明星,所有人都认识明星,明星不认识所有人,只有一种查询方式:A是否认识B,给出找到明星的最优策略
- 一个图,起点是A,终点是B,可以选择图中一条边置为0,如何使A到B的最短路径最短(顺便谢谢Dijkstra)
- 给出二叉树的先序和中序遍历,构建二叉树。
- 链表排序
- 矩阵相乘的最优顺序
- 二分图最大匹配,最小费用最大流
- 把一堆数分成两堆,使和最相近(背包搞一搞)
- 数据流找中位数(大小堆搞一搞)
- 二叉树中权重最大的链,每个点的权重有正有负。
- 加上最少的括号,使括号匹配。
- 给定一个数组,求最大的连续子序列和
- 有两个很大的文件,均无法放入内存,其中存放着很多整数,如何找到两个文件中的相同整数
- 有一个坐标轴,上面有很多点,每个点有坐标,求长度为L的绳子最多能够覆盖几个点
- 用栈实现队列
- 转制&字符串中最长的数字字符串
- 画建最小堆的过程
- 先序遍历二叉树,非递归
- 手写数组旋转,要求不使用额外空间
- 手写算法,在旋转数组里寻找某个给定的元素,要求时间复杂度O(n)以下
- 一个堆,怎么按顺序改为一个双向链表
- 一个无序数组,用时间复杂度最低的来寻找某两个数加起来等于一个固定的值m
- 两个有序数组求中位数(leetcode)
- 判断平衡二叉树(剑指offer)
- 最长上升子序列(lintcode)
- 二叉树转双向链表(剑指offer)
- LRU cache实现(leetcode)
- House Robber(leetcode)
- 判断平衡二叉树
- 最长公共子序列
2. 项目论文
自己的几篇论文和相关的论文已经领域内很火的文章要非常熟悉
3. 面试问题总结
- LR,SVM,KNN,GBDT,XGB推导,算法细节(LR为何是sigmod,理论推导出sigmod,KNN距离度量方式,XGBoost为什么要用二阶信息不用一阶,LR和SVM对比,GBDT和XGB和LightGBM对比)。(我把gbdt从集成方法的区别到adaboost vs gbdt再到sk-learn的gbdt vs XGBoost vs. LightGBM都给他撸了一遍,从原始论文的区别到具体实现的区别,所以这里可能算是面试的一个关键点吧)
- xgboost里面的lambdarank的损失函数是什么?
- xgboost在什么地方做的剪枝,怎么做的?
- xgboost如何分布式?特征分布式和数据分布式? 各有什么存在的问题?
- lightgbm和xgboost有什么区别?他们的loss一样么? 算法层面有什么区别?
- lightgbm有哪些实现,各有什么区别?
- 逻辑回归的目标函数和优化方法
目标函数是服从二项分布的似然函数,优化常用的是梯度下降法
-
CNN DNN RNN 细节以及相关问题(poll层,激活函数,梯度消失弥散问题,LSTM结构图,深度网络优势及缺点)。除了CNN还熟悉其他深度学习模型吗
-
为什么deep learning 能抑制梯度消失或者爆炸的问题?
几个方面:一是激活函数不光是只用sigmoid函数,还有 ReLU函数 二是在参数并不是初始化的时候并不是随机选择的,而是在前面有自编码器做了特征特征器,这样避免了梯度下降法求解陷入局部最优解;三,深度学习一些手段,权值共享,卷积核,pooling等都能抑制梯度消失问题;四,二次代价函数换成交叉熵损失函数或者选用softmax+对数似然代价函数的组合。 -
DNN的初始化方法有哪些? 为什么要做初始化? kaiming初始化方法的过程是怎样的?
-
DL常用的激活函数有哪些? relu和sigmoid有什么区别,优点有哪些?
-
什么是梯度消失,标准的定义是什么?
-
树模型建模过程。
-
特征选择方法,特征提取方法,如何判断特征是否重要。
-
模型训练停止方法。
-
正则化作用。
-
模型效果评价指标
-
AUC 理解和计算方法。
-
L_BFGS, DFP 推导。
-
对机器学习的理解
-
弱分类器组合成强分类器的理论证明。
-
FM,FMM,Rank_SVM算法细节。
-
map_reduce 基本概念以及常见代码处理。
-
过拟合的标志有哪些,过拟合的解决方法。
-
各个损失函数之间的区别。
-
L1,L2正则化相关问题。(L1,L2范数的区别,如何求解)一般求L1的优化方法(坐标下降,LARS角回归)
-
SGD、batch、mini-batch的区别
-
无约束的优化方法,区别
-
PCA、LDA的区别
-
决策树的特征选择 优缺点 ,ID3,C4.5,CART 建树、剪枝优缺点,三种决策树是如何处理缺失值的(三个阶段:划分节点时-训练模型时-预测时),树的融合(GBDT, RF,XGboost),为什么比赛中xgboost 表现比rf要好,从数据的角度分析
在选择分裂属性的时候,训练样本存在缺失值,如何处理?假如你使用ID3算法,那么选择分类属性时,就要计算所有属性的熵增(信息增益,Gain)。假设10个样本,属性是a,b,c。在计算a属性熵时发现,第10个样本的a属性缺失,那么就把第10个样本去掉,前9个样本组成新的样本集,在新样本集上按正常方法计算a属性的熵增。然后结果乘0.9(新样本占raw样本的比例),就是a属性最终的熵。
分类属性选择完成,对训练样本分类,发现属性缺失怎么办?比如该节点是根据a属性划分,但是待分类样本a属性缺失,怎么办呢?假设a属性离散,有1,2两种取值,那么就把该样本分配到两个子节点中去,但是权重由1变为相应离散值个数占样本的比例。然后计算错误率的时候,注意,不是每个样本都是权重为1,存在分数。
训练完成,给测试集样本分类,有缺失值怎么办?这时候,就不能按比例分配了,因为你必须给该样本一个确定的label,而不是薛定谔的label。这时候根据投票来确定,或者填充缺失值。
XGBoost里处理缺失值的方法
在xgboost里,在每个结点上都会将对应变量是缺失值的数据往左右分支各导流一次,然后计算两种导流方案对Objective的影响,最后认为对Objective降低更明显的方向(左或者右)就是缺失数据应该流向的方向,在预测时在这个结点上将同样变量有缺失值的数据都导向训练出来的方向。
例如,某个结点上的判断条件是 A>0 ,有些数据是A0,有些数据的A是缺失值。那么算法首先忽略带缺失值的数据,像正常情况下一样:
将前两种数据分别计算并导流到左子树与右子树,
然后将带缺失值的数据导向左子树,计算出这时候模型的Objective_L;
接着将带缺失值的数据导向右子树,计算出这时候模型的Objective_R;
最后比较Objective_L和Objective_R。
假设Objective_L更小,那么在预测时所有变量A是缺失值的数据在这个结点上都会被导向左边,当作A<=0处理。
随机森林处理缺失值的方法
RandomForest包里有两种补全缺失值的方法:
方法一(na.roughfix)简单粗暴,对于训练集,同一个class下的数据,如果是分类变量缺失,用众数补上,如果是连续型变量缺失,用中位数补。
方法二(rfImpute)这个方法计算量大,至于比方法一好坏?不好判断。先用na.roughfix补上缺失值,然后构建森林并计算proximity matrix,再回头看缺失值,如果是分类变量,则用没有缺失的观测实例的proximity中的权重进行投票。如果是连续型变量,则用proximity矩阵进行加权平均的方法补缺失值。然后迭代4-6次,这个补缺失值的思想和KNN有些类似。
补充【proximity matrix】:Proximity 用来衡量两个样本之间的相似性。原理就是如果两个样本落在树的同一个叶子节点的次数越多,则这两个样本的相似度越高。当一棵树生成后,让数据集通过这棵树,落在同一个叶子节点的”样本对(xi,敏感词roximity 值 P(i,j)加 1。所有的树生成之后,利用树的数量来归一化proximity matrix。
样本类别不平衡会带来怎样的影响
讲一下auc 以及你们比赛中最后模型的auc得分
随机森林里使用的决策树是哪一种? sklearn里实现的是CART的一种变体
-
优化方面 Adam之类
-
长尾数据如何处理
-
GBDT在什么情况下比逻辑回归算法要差
-
GBDT对输入数据有什么要求,如果效果比较差,可能是什么原因造成的
-
比较一下逻辑回归和GBDT
-
sigmoid 函数可以优化梯度消失的问题吗?数学问题,自己推导公式看下
-
sigmoid 函数求导
-
BP神经网络推导一遍
-
神经网络非线性原因分析
-
SVM核函数理解,线性回归如何利用核函数,有什么弊端,假设分离超平面系数非常大怎么办
-
SVM和LR的优缺点,应用场景
-
比较常用的聚类算法,你如何理解在什么场景使用他们
-
机器学习非线性模型以及线性模型解决非线性问题
-
比较随机森林和GBDT,选择一个重点说说,Rf 调参是怎么做的,这里指出树的棵树,层数可以通过样本数,特征数预估,而不是拍脑袋决定
-
如果随机森林的树的个数无穷大,你觉得会过拟合吗,随机森林的随机性,RF原理,优化目标是什么
-
讲下随机森林或者GDBT
随机森林采用的是bagging的思想,bagging又称为bootstrap aggreagation,通过在训练样本集中进行有放回的采样得到多个采样集,基于每个采样集训练出一个基学习器,再将基学习器结合。随机森林在对决策树进行bagging的基础上,在决策树的训练过程中引入了随机属性选择。传统决策树在选择划分属性的时候是在当前节点属性集合中选择最优属性,而随机森林则是对结点先随机选择包含k个属性的子集,再选择最优属性,k作为一个参数控制了随机性的引入程度。 -
随机森林和GDBT的区别
GBDT和随机森林的相同点:1、都是由多棵树组成
2、最终的结果都是由多棵树一起决定
GBDT和随机森林的不同点:
1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
2、组成随机森林的树可以并行生成;而GBDT只能是串行生成
3、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
4、随机森林对异常值不敏感,GBDT对异常值非常敏感
5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能
-
随机森林怎么取最后的结果?
对于分类任务,随机森林是多数表决;
对于回归任务,随机森林是简单平均 -
随机森林是怎样避免ID3算法信息增益的缺点的?
首先说下信息增益的过程,决策树算法本质上就是要找出每一列的最佳划分以及不同列划分的先后顺序及排布。信息增益的缺点是比较偏向选择取值多的属性。而gini系数每次都是二分,所以跟属性多少没有关系。 -
GBDT对异常数值敏感吗,GBDT如何处理缺失值(如何处理缺失值和异常值)
-
高维KNN中的kd树
-
比较经典的网络结构(Googlenet LeNet Resnet之类)
-
Kaggle项目里如何处理数据,计算特征相关性用什么方法,缺失值怎么处理?验证集怎么划分?哪些指标说明你的模型调优了?调节过模型的哪些参数
-
Kmeans 和EM算法的联系
-
sgd和牛顿法的区别,牛顿法和拟牛顿法的关系,拟牛顿法解决了牛顿法哪个问题,推导下牛顿法。牛顿法在什么时候只需要迭代一次就能求解,什么时候牛顿法不能适用。
-
拟牛顿法
对比了下梯度下降法只是泰勒的一阶展开式,而牛顿法是泰勒的二阶展开式,牛顿法主要问题在于海森矩阵求逆是一个很复杂的过程,所有才会有拟牛顿法以及相应的改进算法。 -
正则化方法? L1与L2的区别,为什么可以克服过拟合,L1正则假设的参数分布是什么,L1为什么可以保证稀疏?
-
梯度消失问题的解决方案? batch normalization 为什么能够提升训练速度
-
bagging和boosting,stacking的区别,深入讲解boosting,讲了下gbdt,让推导详解
-
讲一下优化算法,推导下自适应优化算法和带动量的梯度下降
4.基础方面
数据结构/算法
Hash及冲突解决
二叉搜索树
手写快排,单链表反转,字符串部分逆序(如moc.anis.www转为www.sina.com)
手写二叉树层序遍历、二分查找、递归算法实现
超大文件寻找top K算法设计(单机1M内存、Hadoop集群、外部排序+uniq命令)
订单超大并发访问-队列批量处理
观察者模式、工厂模式、适配器模式
hashmap 底层实现,为什么查询快?
常见排序算法时间复杂度为O(nlogn)的有哪些,最佳、最差时间复杂度分别是多少?
进程线程区别
多线程实现方式,线程冲突是什么、怎么解决
海量数据排序(分治)
常见排序算法的复杂度和一些细节以及改进优化。
计算机网络
TCP三次握手,四次挥手等细节。
5层,7层网络相关问题。
tcp和udp的区别
http和https(对称加密、非对称加密)
ftp和sftp
从访问一个网址到页面出现,描述中间发生的所有事情
操作系统/linux
linux进程通信的办法
linux处理文本日志相关常见命令
shell脚本、查找文件命令
top命令、netstat命令、ifconfig和ipconfig
乐观锁和悲观锁
数据库
SQL查询相关业务
第一、第二、第三范式之间的理解和比较
数据库的事务、ACID及隔离级别
索引优化(组合索引、最左匹配原则)、优缺点
手动写创建索引的语句
并发访问场景和所有可能出现的结果、锁作用和实现
主主复制、主从复制
B-tree的应用
int和varchar
io优化
分表分库设计
Python基础(重点)
常见数据结构用法,类继承,内存管理
python的异常机制
仅使用pandas库进行分析是否有什么性能上的问题
用Python 写一个对文本文件的词频统计
翻转链表
C++(重点)
面向对象特性
为什么析构函数要是虚函数
构造函数和析构函数中调用虚函数时,调用的是基类还是派生类
5. 成为算法工程师,应该学习哪些东西
传统机器学习算法:
感知机,SVM, LR,softmax,Kmeans,FM/FFM ,DBSCAN, 决策树(CART,ID3,C4.5)GBDT, RF, Adaboost, xgboost, EM, BP神经网络,朴素贝叶斯,LDA,PCA,核函数,最大熵等
深度学习:
CNN,RNN,LSTM,常用激活函数,Adam等优化算法,梯度消失(爆炸)
NLP:
TF-IDF, textrank, word2vec(能推导),LCA, simhash
常见概念:
最大似然估计,最小二乘法,模型融合方法,L1L2正则(Lasso, elestic net),判别式模型与生成式模型,熵-交叉熵-KL散度,数据归一化,最优化方法(梯度下降,牛顿法,共轭梯度法),无偏估计,F1(ROC,recall,precision等),交叉验证, bias-variance-tradeoff, 皮尔逊系数
常见问题
常见损失函数
SGD与BGD
如何处理样本非均衡问题
过拟合原因,以及解决办法
如何处理数据缺失问题
如何选择特征
L1为什么能让参数稀疏,L2为什么会让参数趋于较小值,L1优化方法
各模型的优缺点,以及使用场景
什么叫对一个算法熟悉
以SVM为例,SVM推导,KKT条件,什么是支持向量,什么是松弛向量,为什么推导成对偶形式,核函数的作用是什么,如何选择核函数,模型优缺点
6. 设计题
给定(用户id,时间,经度,维度)四元组,设计方案识别用户家和公司的位置。这题个人觉得是很好的面试设计题,我的方法是密度聚类定地点位置,时间段活跃特征+是否工作日训练分类识别别家/公司的方法
8个球,一个比其他的轻,用天平称出该球最少用几次,怎么称