机器学习

1.(腾讯)SVM的原理是什么?
参考答案: 支持向量机(SVM)第一种二类分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;支持向量机还包括核技巧,这使它成为实质上的非线性分类器。硬几何最大化解决线性可分问题,软几何间隔最大化解决线性不可分问题(摘自《统计学习方法》)。

2.(腾讯)LR的原理是什么?
参考答案: 逻辑回归以一个二分类算法,它的对数几率函数是一个线性函数 wTx w^Tx,我们用sigmoid函数近似 P(Y=1|X)=exp(wTx+b)1+exp(wTx+b) P(Y=1|X)=\frac{\exp(w^Tx+b)}{1+\exp(w^Tx+b)},那么 P(Y=0|X)=11+exp(wTx+b) P(Y=0|X)=\frac{1}{1+\exp(w^Tx+b)}。当线性函数的值接近于无穷是,概率值接近于1;反之,概率值接近于0。它本质上是一个线性模型,属于判别方法。

3.(腾讯)RF的优缺点是什么?
原理: 随机森林由LeoBreiman(2001)提出,它通过自助法(bootstrap)重采样技术,从原始训练样本集 N N中有放回地重复随机抽取NN个样本生成新的训练样本集合,然后根据自助样本集生成k个分类树组成随机森林,在构造第i棵决策是时,在每个节点随机选择m(通常 log2d+1 \log _2 d+1, d d是特征数)个特征作为该点划分的候选特征。新数据的分类结果按分类树投票多少形成的分数而定。其实质是对决策树算法的一种改进,将多个决策树合并在一起,每棵树的建立依赖于一个独立抽取的样品。单棵树的分类能力可能很小,每棵树都会完整成长而不会剪枝(Pruning)(这有可能在建完一棵正常树状分类器后会被采用),但在随机产生大量的决策树后,一个测试样品可以通过每一棵树的分类结果经统计后选择最可能的分类。
优点:

  • 在当前的很多数据集上,相对其他算法有着很大的优势,表现良好。
  • 它能够处理很高维度(feature很多)的数据,并且不用做特征选择。
  • 在训练完后,它能够给出哪些feature比较重要。
  • 在创建随机森林的时候,对generlization error使用的是无偏估计,模型泛化能力强。
  • 训练速度快,容易做成并行化方法。
  • 在训练过程中,能够检测到feature间的互相影响。
  • 对于不平衡的数据集来说,它可以平衡误差。
  • 如果有很大一部分的特征遗失,仍可以维持准确度。

缺点:

  • 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
  • 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

4.(腾讯)数据建模的过程是什么?
参考答案: 数据预处理->构建训练集和测试集->提取特征->选择学习算法->评估模型的有效性。

5.(腾讯)如何评估一个特征的有效性?
参考答案: 用特征之间的相关系数来评估特征之间的相关性,去掉相关性很大的一些特征;用决策树自动对特征重要性排序,越靠近根部的特征越重要。

6.(蘑菇街)说一下在参加阿里的比赛中,用到什么算法,怎么做的数据预处理,遇到什么困难。
参考答案:

  • 用到LR,SVM,GBDT和RF。
  • 去掉爬虫用户(点击量很大,购买量为零或者很小),去掉只有购买行为的用户(应为其他行为数据缺失),去掉只在双12有购买的用户和被购买的商品(因为是打折促销)。
  • a. 平台不熟悉,一开始python,sql和mapreduce都没用过,御膳房的文档也不够友好,导致前期花了很多时间来熟悉比赛的平台,好在慢慢研究官方的文档,慢慢对平台熟悉起来。b. 特征选择问题,一次性加入的特征太多,效果并不好,最后特征选择遇到困难,用具有单棵树的随机森林来选特征。c. 时间问题,实验室并不允许我们做其他的事情,我们只能在早上和晚上做比赛,往往是一边要完成实验室的科研工作,另外一方面也要每天在比赛上有新的突破,平衡时间很重要。

7.(蘑菇街)特征有做哪些处理?怎么筛选特征?
参考答案: 归一化,平滑处理。用特征之间的相关系数来评估特征之间的相关性,去掉相关性很大的一些特征;用决策树自动对特征重要性排序,越靠近根部的特征越重要。

8.(蘑菇街)怎么平滑的,在(购买量/点击量)上平滑,如果点击量为0可能存在问题?
参考答案: 用户有四种行为,并不会出现只有购买行为而无其他行为的情况。

9.(蘑菇街)介绍一下GBDT算法。
**参考答案:**Gradient Boost其实是一个框架,里面可以套入很多不同的算法。Boost是”提升”的意思,一般Boosting算法都是一个迭代的过程,每一次新的训练都是为了改进上一次的结果。

原始的Boost算法是在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。在每一步训练中得到的模型,会使得数据点的估计有对有错,我们就在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。

而Gradient Boost与传统的Boost的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boost中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少,与传统Boost对正确、错误的样本进行加权有着很大的区别。

10.(蘑菇街)优化方法,梯度下降和拟牛顿法有什么优缺点?
11.(蘑菇街)梯度下降法中的中的学习率怎么自适应得到?根据什么信息可以确定自适应率。因为你是做控制的,你们控制里面怎么自适应得到学习率?
12.(蘑菇街)在树模型中,除了熵,基尼指数,信息增益以外,还可以用来什么衡量不确定性?(比如方差?)
参考答案:分类树(classification tree)跟回归树相比,主要是分裂节点和修剪树的准则不同。首先定义节点m中类k的观测比例为:

p^mk=1Nm∑xi∈RmI(yi=k)

\hat p_{mk}=\frac{1}{N_m}\sum_{x_i\in R_m} I(y_i=k)
分裂准则常用下面三个“误分类不纯度”、“Gini不纯度”、“熵不纯度”:

  • Misclassification error: 1Nm∑i∈RmI(yi≠k(m))=1−p^mk(m) \frac{1}{N_m}\sum_{i\in R_m}I(y_i \neq k(m))=1-\hat p_{mk}(m)
  • Gini index: ∑k≠k′p^mkp^mk′=∑Kk=1p^mk(1−p^mk) \sum_{k\neq k'} \hat p_{mk}\hat p_{mk'}=\sum_{k=1}^K\hat p_{mk}(1-\hat p_{mk})
  • Cross-entropy or deviance: −∑Kk=1p^mklogp^mk -\sum_{k=1}^K\hat p_{mk}\log \hat p_{mk}

分裂时,找到使不纯度下降最快的分裂变量和分裂点。不纯度的下降落差可以直观的定义为:

Δi(N)=i(N)−PLi(NL)−(1−PL)i(NR)

\Delta i(N)=i(N)-P_Li(N_L)-(1-P_L)i(N_R)
剪枝时,最常用的是“误分类不纯度”准则。另外,三个准则在2类分类时节点不纯度的函数图为:

从图中可以看出“Gini不纯度”、“熵不纯度”可微,更适合数值优化。市场上流行的一种决策树CHAID使用一种基于统计 χ2 \chi^2检验的属性选择度量。其他不纯度度量包括C-SEP(在某些情况下,他比信息增益和基尼指数的性能好)和G-统计量(一种信息论度量,非常近似于 χ2 \chi^2分布)(摘自《数据挖掘:概念与技术》P222)。

13.(蘑菇街)对偶原理适合解决什么问题?对偶原理有什么条件?
参考答案: 高阶问题,原始问题不好解,用对偶原理比较好解,如果满足KKT条件,那么原始问题和对偶问题的解相等。

14.(蘑菇街)梯度下降和随机梯度下降有什么优缺点?
参考答案: 在线性回归中,标准梯度下降法每次迭代中都要计算所有训练样本的误差,因此每次参数更新都是所有训练样本误差累加的结果。其算法如下:

Repeat until convergence {

θj:=θj+α∑i=1n(y(i)−hθ(x(i)))x(i)j(j=1,2,…,m)

\theta_j:=\theta_j+\alpha\sum_{i=1}^n(y^{(i)}-h_\theta(x^{(i)}))x_j^{(i)}(j=1,2,\dots,m)}

标准梯度下降法因为是在所有训练样本误差的基础上更新每次参数,因此每一步的比随机梯度下降法走的大,因为它使用的是真正的梯度。其缺点是每一步的计算量会很大,很容是产生锯齿现象,使得收敛速度慢,即一阶逼近函数得到的模型比较粗糙。

随机梯度下降法,每次参数更新只选取一个训练样本,虽不是严格意义上的梯度,但是大的整体方向是全局最优的。算法如下:

Loop {

for i=1 to n {

θj:=θj+α(y(i)−hθ(x(i)))x(i)j(j=1,2,…,m)

\theta_j:=\theta_j+\alpha (y^{(i)}-h_\theta(x^{(i)}))x_j^{(i)}(j=1,2,\dots,m) }

相对于标准的梯度下降法来说,随机梯度下降法每次迭代只考虑一个训练样本,笔试严格意义上的梯度,因此下降比较小的步长,但是当训练样本比较大时,随机梯度下降发速度比较快。另外,如果标准误差曲面有多个局部极小值,随机梯度下降有时更不容易陷入这些局部极小值中。

15.(一点资讯)SVM的原理是什么?目标函数和约束条件分别是什么?
参考答案:支持向量机(SVM)第一种二类分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;支持向量机还包括核技巧,这使它成为实质上的非线性分类器。硬几何最大化解决线性可分问题,软几何间隔最大化解决线性不可分问题(摘自《统计学习方法》)。
目标函数:

minw,b,ξ12∥w∥2+C∑i=1Nξi

\min_{w,b,\xi}\frac{1}{2}\|w\|^2+C\sum_{i=1}^N\xi_i
约束条件:

yi(wTxi+b)≥1−ξi,i=1,2,…,N

y_i(w^Tx^i+b)\ge 1-\xi_i, i=1,2,\dots,N

ξi≥0,i=1,2,…,N

\xi_i\ge 0,i=1,2,\dots,N

16.(一点资讯)LR也可以推广到非线性分类器(利用核方法),但相比于SVM来说,LR的 w w是所有样本关于核函数的线性组合,而SVM的ww是支持向量关于核函数的线性组合,在这点上来说,SVM比LR更优,这也正是SVM受到更多关注的原因之一。
参考答案:

17.(一点资讯)在数据量比较大时,SVM有什么缺点?
参考答案:在数据量比较大的时候,SVM的支持向量会呈现出线性增长的趋势,在做预测的时候,速度很慢,这也是工业界不常使用非线性SVM的原因之一。

18.(一点资讯)介绍RF与GBDT的不同。
参考答案:

19.(一点资讯)LR的L1和L2正则化有什么区别?
参考答案:机器学习可以看作最小化下面的目标函数:

J(w)=argminw∑iL(yi,f(xi;w))+λΩ(w)

J(w)=\arg \min_w \sum_i L(y_i,f(x_i;w))+\lambda \Omega(w)
第一项 L(yi,f(xi;w)) L(y_i,f(x_i;w))衡量模型对第 i i个样本的预测值和真实值之间的误差。因为模型是要拟合训练样本的,所以要求这一项最小,也就是要求模型尽量的拟合训练数据。但正如上面所言,不仅要保证训练误差最小,我们更希望模型尽量简单,所以需要加上第二项,也就是对参数ww的正则化函数 Ω(w) \Omega (w)去约束模型尽量的简单。

机器学习的大部分带参模型都很相似,大部分无非就是变换这两项而已。对于第一项Loss函数,如果是Square loss,那就是最小二乘了;如果是Hinge Loss,那就是著名的SVM了;如果是exp-Loss,那就是牛逼的 Boosting了;如果是log-Loss,那就是Logistic Regression了;还有等等。不同的loss函数,具有不同的拟合特性,这个也得就具体问题具体分析的。

L1范数是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。L0范数是指向量中非0的元素的个数。如果我们用L0范数来正则化一个参数矩阵 w w的话,就是希望ww的大部分元素都是0。为什么不用L0,而要用L1呢?个人理解一是因为L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。总之,L1范数和L0范数可以实现稀疏,L1因具有比L0更好的优化求解特性而被广泛应用。

现在大概知道了L1可以实现稀疏,为什么要稀疏? 可能有两点原因:

(1).它能实现特征的自动选择。一般来说, xi x_i的大部分元素(也就是特征)都是和最终的输出 yi y_i没有关系或者不提供任何信息的,在最小化目标函数的时候考虑 xi x_i这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确 yi y_i的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。

(2). 另一个青睐于稀疏的理由是,模型更容易解释。例如患某种病的概率是 y y,然后我们收集到的数据xx是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型: y=w1∗x1+w2∗x2+⋯+w1000∗x1000+b y=w_1*x_1+w_2*x_2+\dots+w_{1000}*x_{1000}+b(当然了,为了让 y y限定在[0,1]的范围,一般还得加个Logistic函数)。通过学习,如果最后学习到的w∗w^*就只有很少的非零元素,例如只有5个非零的 wi w_i,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。

正则化L2范数 ∥w∥2 \|w\|_2,不逊于L1范数,在回归中叫“岭回归”(Ridge Regression),也叫“权值衰减weight decay”。它的强大功效是改善机器学习里面一个非常重要的问题:过拟合。

为什么L2范数可以防止过拟合?

我们让L2范数的正则项 ∥w∥2 \|w\|_2最小,可以使得 w w的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0。而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。

L2范数的好处是什么呢?这里也扯上两点:

(1). 从学习理论的角度来说,L2范数可以防止过拟合,提升模型的泛化能力。

(2).从优化或者数值计算的角度来说,L2范数有助于处理 condition number不好的情况下矩阵求逆很困难的问题。参见http://blog.csdn.net/zouxy09/article/details/24971995/。

L1和L2为什么一个让绝对值最小,一个让平方最小,会有那么大的差别呢?下面是两种几何上直观的解析:
(1).下降速度:L1和L2都是正则化的方式,我们将权值参数以L1或者L2的方式放到代价函数里面去。然后模型就会尝试去最小化这些权值参数。而这个最小化就像一个下坡的过程,L1和L2的差别就在于这个“坡”不同,如下图:L1就是按绝对值函数的“坡”下降的,而L2是按二次函数的“坡”下降。所以实际上在0附近,L1的下降速度比L2的下降速度要快。所以会非常快得降到0。不过我觉得这里解释的不太中肯,当然了也不知道是不是自己理解的问题。

(2).
实际上,对于L1和L2规则化的代价函数来说,可以写成以下形式:

Lasso:minw12∥y−Xw∥2,s.t.∥w∥1≤C

Lasso: \min_w\frac{1}{2}\|y-Xw\|^2,s.t. \|w\|_1\le C

Ridge:minw12∥y−Xw∥2,s.t.∥w∥2≤C

Ridge:\min_w\frac{1}{2}\|y-Xw\|^2,s.t. \|w\|_2\le C
也就是说,我们将模型空间限制在w的一个L1-ball 中。为了便于可视化,我们考虑两维的情况,在(w1, w2)平面上可以画出目标函数的等高线,而约束条件则成为平面上半径为C的一个 norm ball 。等高线与 norm ball 首次相交的地方就是最优解:

可以看到,L1-ball 与L2-ball 的不同就在于L1在和每个坐标轴相交的地方都有“角”出现,而目标函数的测地线除非位置摆得非常好,大部分时候都会在角的地方相交。注意到在角的位置就会产生稀疏性,例如图中的相交点就有w1=0,而更高维的时候(想象一下三维的L1-ball 是什么样的?)除了角点以外,还有很多边的轮廓也是既有很大的概率成为第一次相交的地方,又会产生稀疏性。

相比之下,L2-ball 就没有这样的性质,因为没有角,所以第一次相交的地方出现在具有稀疏性的位置的概率就变得非常小了。这就从直观上来解释了为什么L1-regularization 能产生稀疏性,而L2-regularization 不行的原因了。

因此,一句话总结就是:L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。Lasso在特征选择时候非常有用,而Ridge就只是一种规则化而已。

可参考博文:http://freemind.pluskid.org/machine-learning/sparsity-and-some-basics-of-l1-regularization/

大数据

1.(腾讯)Mapreduce的原理是什么?
2.(腾讯)Mapreduce的二次排序是怎样的?

3.(一点咨询)在参加阿里移动推荐算法大赛中,提取了哪些特征?
参考答案:分为4类特征:UI对特征,用户特征,商品特征和类目特征。这四类特征在粒度上又分为:天粒度特征,半天粒度特征,小时粒度特征和行为统计特征。天粒度特征主要有:最后一天、最后两天、最后三天的行为量以及转化率特征,行为天数在总天数的比例,行为天数除以购买天数,平均每天的行为次数。半天粒度的特征包括行为总半天数占总行为半天数的比例。小时粒度特征包括:最大最小行为时刻,行为时间平均跨度,行为时间方差。行为统计特征包括:行为次数,行为标志位特征(有过这种行为则为1,否则为0),行为次数占总行为次数比例,购买前的行为次数,购买前的平均行为天数,第一次购买前的行为次数,最后一次购买后的行为次数。我们还参考Marvel队伍对行为衰减做了曲线拟合,计算行为次数的时候乘以这个衰减系数。

当四大类特征中也有各自不同的部分,如UI对特征中与衰减因子相关的特征、第一次购买前的行为次数和最后一次购买后的行为次数是其他三类没有的特征。用户独有的特征是购买的商品总数、购买商品占总浏览商品的比例、购买商品的类目占总浏览类目的比例。商品独有的特征有购买次数超过1次的用户数、重复购买的用户数百分比。

在第二赛季后期,我们也考虑到要加入地理位置(用geohash编码的形式给出)特征。经过统计我们发现,在经过数据清理之后的数据中,只有802202条用户数据中用户和商品的地理位置都不缺失(总共3.3亿条用户数据),有地理位置的商品数是11705个(总共1058291个商品),因此可以说地理位置的信息非常稀疏。有27.9%的商品有两个以上的位置信息,有72.1%的商品只有一个位置信息。用户距离商品最远距离是19454192米,用户距离商品最近距离是0。商品的地理位置不唯一,因此我们不能确切的知道用户操作的商品在哪个位置(用户数据和商品数据是两个分开的文件,用户数据中只有用户的地理位置,商品数据中只有商品的位置)。最后我们提取的地理位置特征有:用户4中行为与商品的最近距离、最远距离、平均距离,所有行为与商品距离的平均距离,用户行为地理位置标志位特征(有地理位置则为1,否则为0),商品地理位置标志位特征(有地理位置则为1,否则为0),用户的平均活动范围,商品的平均分布范围。

4.(一点资讯)有一个数据集,里面包含垃圾文章和非垃圾文章。该数据集很大,假设只对其中一小部分文章做了标注(标注是否为垃圾文章),现在不想再人工标注了,想不仅仅利用已标注的文章去训练一个垃圾文章分类器,还想利用更多的数据来训练这个分类器。该怎么办?
参考答案:可以先用那一小部分已标注的数据训练一个比较粗糙的分类器,拿这个分类器对剩下的大部分数据进行分类,取分类器置信度(confidence)较高的样本作为训练样本,重新训练一个比较准确的分类器,这样成功利用上了更多的数据。

5.(一点资讯)两个50亿级别的URL表,每条URL占64字节,在内存为4GB的电脑上求出两个表中相同的URL。
参考答案:

6.(一点资讯)有两个数组,包含有50亿的数据,问如何从中选出相同的元素?
参考答案:

C++

1.(腾讯)野指针是什么?怎么造成的?
2.(腾讯)虚函数是怎么回事?
3.(蘑菇街)熟悉C++,Boost?

4.(深信服)红黑树怎么保持平衡?

算法与数据结构

1.(腾讯)简单叙述一下快速排序的原理。

2.容器类hashmap与hashtable的区别是什么?
参考答案: C++中的标准模版库(STL)中是没有hashtable的。 C++中的map是通过对数据的键值的比较来进行数据的存放和查找的。所以map是需要提供键值的比较函数的。通常我们使用string类型作为键值类型,是使用了C++提供的缺省的比较函数。如果是另外的自定义的类型作为键值的话,就要自己提供比较函数了。
从数据结构上来说,hash是一种按照某种键值查找和存放一组数据的数据结构和方法策略。它是通过对键值数据提供hash值的算法实现的。一般hash值是一个整型数字。它的效率很大程度上取决于hash值的产生。它的重复率越低,效率就越高。如果没有重复率,那么它的查找效率应该比任何一个算法都高。可惜的是,对于一些应用的情况,很难找到一个好的hash值的算法。
map实际上算不是一种数据结构的名词。它是C++及java语言的一个类的名字罢了。但它同hash查找的应用目标应该是相一致的。都是通过键值找到对应的数据记录。甚至map也可以用hash算法来实现,那么它就是一个hashtable了。
在《STL源码剖析》中SGI版本的STL实现中有讲到hashtable和hashmap。hashtable可以提供任何有名项(named item)的存取操作和删除操作,也可被视为一种字典结构,它通过一个hash函数将剑指(key)映射为一个整数值,这个值对应一个桶子,key所对应的value存储在桶子中。SGI在STL标准规格之外,另提供了一个所谓的hashmap,以hashtable为底层机制。由于hashmap所供应的借口操作,hashtable都有提供,所以几乎所有的hashmap操作行为,都只是转调用hashtable的操作而已。map的特性是每一个元素都同时拥有一个实值(key)和一个键值(value)。这一点在hashmap中也是一样,hashmap的使用方式跟map完全相同。普通的map在底层是用红黑树实现的,因此具有自动排序功能,而hashtable没有这样的功能,因为hashmap底层用hashtable实现,是无序的一种数据结构。

3.(拉勾网)哈希表中有哪些解决冲突的方法?拉链法是怎样的?
参考答案: 哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈希表。这种方法的基本思想是:首先在元素的关键字k和元素的存储位置p之间建立一个对应关系f,使得p=f(k),f称为哈希函数。创建哈希表时,把关键字为k的元素直接存入地址为f(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置p=f(k),从而达到按关键字直接存取元素的目的。

当关键字集合很大时,关键字值不同的元素可能会映象到哈希表的同一地址上,即 k1≠k2 ,但 f(k1)=f(k2),这种现象称为冲突,此时称k1和k2为同义词。实际中,冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突。综上所述,哈希法主要包括以下两方面的内容:

  • 如何构造哈希函数
  • 如何处理冲突。

构造哈希函数的方法:

  • 数字分析法
    如果事先知道关键字集合,并且每个关键字的位数比哈希表的地址码位数多时,可以从关键字中选出分布较均匀的若干位,构成哈希地址。例如,有80个记录,关键字为8位十进制整数d1d2d3…d7d8,如哈希表长取100,则哈希表的地址空间为:00~99。假设经过分析,各关键字中 d4和d7的取值分布较均匀,则哈希函数为:h(key)=h(d1d2d3…d7d8)=d4d7。例如,h(81346532)=43,h(81301367)=06。相反,假设经过分析,各关键字中 d1和d8的取值分布极不均匀, d1 都等于5,d8 都等于2,此时,如果哈希函数为:h(key)=h(d1d2d3…d7d8)=d1d8,则所有关键字的地址码都是52,显然不可取。
  • 平方取中法
    当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。
  • 分段叠加法
    这种方法是按哈希表地址位数将关键字分成位数相等的几部分(最后一部分可以较短),然后将这几部分相加,舍弃最高进位后的结果就是该关键字的哈希地址。具体方法有折叠法与移位法。移位法是将分割后的每部分低位对齐相加,折叠法是从一端向另一端沿分割界来回折叠(奇数段为正序,偶数段为倒序),然后将各段相加。例如:key=12360324711202065,哈希表长度为1000,则应把关键字分成3位一段,在此舍去最低的两位65,分别进行移位叠加和折叠叠加,求得哈希地址为105和907,如下图所示。
  • 除留余数法
    假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为
    h(k)=k % p ,其中%为模p取余运算。
    例如,已知待散列元素为(18,75,60,43,54,90,46),表长m=10,p=7,则有
    h(18)=18 % 7=4 h(75)=75 % 7=5 h(60)=60 % 7=4
    h(43)=43 % 7=1 h(54)=54 % 7=5 h(90)=90 % 7=6
    h(46)=46 % 7=4
    此时冲突较多。为减少冲突,可取较大的m值和p值,如m=p=13,结果如下:
    h(18)=18 % 13=5 h(75)=75 % 13=10 h(60)=60 % 13=8
    h(43)=43 % 13=4 h(54)=54 % 13=2 h(90)=90 % 13=12
    h(46)=46 % 13=7
  • 伪随机数法
    采用一个伪随机函数做哈希函数,即h(key)=random(key)。
    在实际应用中,应根据具体情况,灵活采用不同的方法,并用实际数据测试它的性能,以便做出正确判定。

解决冲突的方法:

  • 开放定址法
    这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。这种方法有一个通用的再散列函数形式:
    Hi=(H(key)+di)% m i=1,2,…,n
    其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。主要有以下三种:

    • 线性探测再散列
      dii=1,2,3,…,m-1
      这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
    • 二次探测再散列
      di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 )
      这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。
    • 伪随机探测再散列
      di=伪随机数序列。
      具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点。
      例如,已知哈希表长度m=11,哈希函数为:H(key)= key % 11,则H(47)=3,H(26)=4,H(60)=5,假设下一个关键字为69,则H(69)=3,与47冲突。如果用线性探测再散列处理冲突,下一个哈希地址为H1=(3 + 1)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 + 2)% 11 = 5,还是冲突,继续找下一个哈希地址为H3=(3 + 3)% 11 = 6,此时不再冲突,将69填入5号单元,参见下图(a)。如果用二次探测再散列处理冲突,下一个哈希地址为H1=(3 + 12)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 - 12)% 11 = 2,此时不再冲突,将69填入2号单元,参下图(b)。如果用伪随机探测再散列处理冲突,且伪随机数序列为:2,5,9,……..,则下一个哈希地址为H1=(3 + 2)% 11 = 5,仍然冲突,再找下一个哈希地址为H2=(3 + 5)% 11 = 8,此时不再冲突,将69填入8号单元,参下图(c)。
  • 再哈希法
    这种方法是同时构造多个不同的哈希函数:
    Hi=RHj(key) j=1,2,…,k
    当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。
  • 链地址法
    这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
    例如,已知一组关键字(32,40,36,53,16,46,71,27,42,24,49,64),哈希表长度为13,哈希函数为:H(key)= key % 13,则用链地址法处理冲突的结果如下图所示:

    本例的平均查找长度 ASL=(1*7+2*4+3*1)=1.5
  • 建立公共溢出区
    这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表.

4.(一点资讯)求出二叉树中所有路径之和,如下图的二叉树,求和的结果为:123+124+15=262。

参考代码:在纸上手写代码。

struct BinaryTree{int m_Value;BinaryTree *m_Left;BinaryTree *m_Right;
};
void GetAllPathSum(BinaryTree *pRoot,int current,int &sum)
{if(pRoot==NULL)return;current=current*10+pRoot->m_Valuej;if(pRoot->m_Left==NULL && pRoot->m_Left)sum=sum+current*10+current;if(pRoot->m_Left)GetAllPathSum(pRoot->m_Left,current,sum);if(pRoot->m_Right)GetAllPathSum(pRoot->m_Right,current,sum);
}
int main()
{int sum=10;BinaryTree *pRoot;...//创建二叉树GetAllPathSum(pRoot,0,sum);
}

5.(一点资讯)给定一个长的字符串和一个短的字符串,要求找出长字符串中最短的包含短字符串的最小子串。其中短字符串中的字符出现的顺序不重要(该问题对应搜索引擎中query和返回搜索结果摘要的匹配问题)。例如,下图中有3个子串满足要求:2-6、6-7和7-9,最短的子串是6-7。

参考答案:把短的字符串存入字典中,在长字符串上定义两个指针。先固定P1,移动P2,查询扫过的字符是否在字典中,在的话就把相应字符的value加1,当字典中的所以key的value都不等于0,这时就找到了一个子串,记录子串的长度和P1、P2。然后,P1向后移动,对扫过的字符在字典中的value减1操作,如果字典中的value都不等于0,则更新子串的长度。当字典中有value重新回到0,则P1固定,P2向后移动,依次进行下去,即可找到最短的子串。

6.(一点资讯)有一个单向链表的长度未知,怎样从中随机取出一个节点?要求每个节点被选中的概率相等,时间复杂度要求是O(n)。
参考答案:遍历一次链表,用一个临时变量pTemp指向返回的节点,设一个计数器iCount统计已遍历的节点个数,然后生成0到iCount-1之间的随机数;若生成的随机数为0,则将pTemp指针替换为当然节点的地址。可以证明对每一个节点,它被选中的概率为1/n,n为链表的长度。对于第i个节点,被选中的概率为: p=1iii+1i+1i+2…n−1n=1n p = \frac{1}{i} \frac{i }{i+1}\frac{i+1}{ i+2}\dots\frac{n-1}{n} = \frac{1}{n}。

7.(一点资讯)设计一个栈,要求能在)O(1)时间复杂度内执行push,pop操作,并且能在O(1)时间复杂度内返回栈中的最小值。
参考答案:参考《剑指offer》面试题21。

8.(一点资讯)聚会中有10000个人,如果甲和乙是朋友,乙和丙是朋友,那么默认甲和丙也是朋友(传递性)。现在给你5000个朋友关系对,同样的给5000个询问消息对,询问这些信息对中两者是否是朋友?算法复杂度是多少?

计算机网络

1.(深信服)time-wait标记位在何时使用?send()函数在什么时候可能发生错误?

其他

1.(蘑菇街)先介绍一下自己。
参考答案: 各位老师,大家上午好,我叫***,是***大学自动化学院的硕士研究生,今年24岁,我来自湖北**。我想要应聘的岗位是数据挖掘工程师或者机器学习相关的职位,之所以选择数据挖掘工程师作为职业生涯的起点,一方面,是因为我对机器学习方向很感兴趣,利用业余时间,我学习了相关的理论知识;另一方面,今年我参加了阿里移动推荐算法大赛,积累了一定的数据挖掘实战经验,通过比赛使我对机器学习的理论有更深入的理解,并且我也意识到理论知识只有应用到实践中才有意义。在实验室的科研工作中,我主要研究的是康复机器人的智能控制算法,并且我在控制领域知名期刊上发表过英文的论文。另外,在校期间,我学习成绩优异,曾两次获得***大学一等奖学金。对于未来,我充满信心,也感受到了一定的压力,万丈高楼平地起,我希望自己能够在自己喜欢的岗位上找到属于自己的天空。

2.(蘑菇街)简单介绍一下你的科研项目。
参考答案: 我主要研究的是康复机器人的智能控制算法,包括自适应控制,神经网络控制和模糊控制。这些控制算法的目的是让康复机器人带动中风病人做康复治疗,使病人能跟随机器人完成预定的动作轨迹,逐步恢复自主活动能力。这些算法要能够保证精确的位置控制,让病人能够更准确的完成预先设定的动作。

3.(蘑菇街)除了简历上的东西,你还有哪些亮点?
参考答案: 自己的学习能力比较强,这主要可以从两个方面来体现: a. 在参加阿里移动推荐算法大赛的开始,自己并不熟悉Python,Sql和Mapreduce,但是为了能够顺利的进行比赛,我必须以最快的熟悉这些工具,而良好的学习能力保证了我在较短的时间内学会并使用这些工具做比赛;b. 在实验室的科研项目中,由于较强的学习能力,我在控制领域知名的期刊上发表过英文论文,也在学术会议上发表过英文论文,被EI检索。

4.(拉勾网)工作地点在北京,你能来实习吗?
参考答案: 潜在意思是问该公司是不是你的目标公司,没把握好!

互联网公司面试中经常被问的问题相关推荐

  1. Python培训常识:Python面试中常被问到的几种设计模式要知道

    学习Python技术大家都是为了日后能够找到适合自己的工作岗位,那么除了要学习好Python技术外,对于面试环节的问题也要有所了解,本期小编为大家介绍的Python培训教程就算关于Python面试中常 ...

  2. 面试中经常会问的智力题,来看看你会做几道

    转载自   面试中经常会问的智力题,来看看你会做几道 下面是大部分题目来自滴滴出行2017秋招题.开始头脑风暴吧~~~ 问题 question one 有50家人家,每家一条狗.有一天警察通知,50条 ...

  3. 这些面试中经常被问到的线程池问题,你都能回答的上来吗?

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:Real_man juejin.im/post/5e435ac3f265da5753 ...

  4. e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗

    #新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...

  5. (免费领取Java面试题)Java面试中经常被问到的问题

    (免费领取Java面试题)Java面试中经常被问到的问题 免费领取Java面试题 -------------https://blog.csdn.net/kaikeba/article/details/ ...

  6. 面试中,被问到“哑口无言”的瞬间怎么办?

    在面试过程中,可能会遇到各种意想不到的问题,有些问题会让你感到非常自信,而有些问题却会让你感到犯愁,甚至哑口无言.这种情况发生时,如何应对是很关键的.面试中,被问到"哑口无言"的瞬 ...

  7. 面试中常被问到(11)虚函数/纯虚函数

    虚函数 如何定义一个虚函数?在基类成员函数前加入virtual关键字,但并不代表此函数不被实现,只是说明允许基类指针调用派生类重写的此函数 一个类只要声明有虚函数或者从基类继承了虚函数,在编译过程中就 ...

  8. 淘宝十年资深程序员在面试中最爱问的秒杀的面试题

    淘宝十年资深程序员在面试中最爱问的秒杀的面试题 文章目录 淘宝十年资深程序员在面试中最爱问的秒杀的面试题 1.什么是秒杀?秒杀是什么场景? 2.秒杀场景下有哪些挑战?如何应对这些挑战? 3.如何防止商 ...

  9. AUC/ROC:面试中80%都会问的知识点

    本文分享自华为云社区<技术干货 | 解决面试中80%问题,基于MindSpore实现AUC/ROC>,原文作者:李嘉琪. ROC/AUC作为机器学习的评估指标非常重要,也是面试中经常出现的 ...

最新文章

  1. OUYA设备的购买和安装
  2. 有关定时任务的表达式--cron 详细解
  3. java的静态内部类
  4. 《图解CSS3:核心技术与案例实战》——1.1节什么是CSS3
  5. 添加或者更新字段说明
  6. HTML5开发手机应用--viewport的作用--20150216
  7. ALV_GRID介绍
  8. Python基础教程:自定义迭代器
  9. Python基础概念_3_操作符与表达式
  10. ArcGis dbf读写——挂接Excel到属性表 C#
  11. 获取freemarker处理后的内容
  12. slackware启动脚本详解
  13. 网络空间安全要学c语言吗,网络空间安全科学与技术(英文)杂志投稿-专门发布期刊官方征稿信息-万维书刊网...
  14. 结果概率_解疑:一批网申结果何时出?通过网申的概率有多大?
  15. mysql 正则排序_MySQL-排序、GROUP BY、连接、NULL值处理、正则表达式、事务
  16. PDF在线预览 (flexpaper+swftools+saveaspdfandxps)
  17. Vivado 2019.1下载与安装
  18. 404终结者——IPFS新引擎Filenet
  19. 如鹏网.Net高级技术9.XML文件操作
  20. weadmin3.0版本安装过程

热门文章

  1. 解决strcpy函数不安全问题
  2. postgres-xl 数据库 安装中文分词 zhparser
  3. 创业有什么好的项目吗?
  4. 王一恒《跨部门沟通与协作》讲座学习笔记(图文)
  5. 搭建个人深度学习环境(一)—— 单GPU主机配置
  6. 【论文阅读】定量评估服务模式__Quantitative Assessment of Service Pattern: Framework, Language, and Metrics
  7. 【iOS知识学习】_iPhone清理缓存
  8. python中index()函数的使用
  9. MySQL的优势(优点)
  10. 电信烽火2821t虚拟服务器设置,终端使用指南