互联网公司面试中常常被问的问题

机器学习

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

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

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


优点:

  • 在当前的非常多数据集上,相对其它算法有着非常大的优势,表现良好。

  • 它能够处理非常高维度(feature非常多)的数据,而且不用做特征选择。
  • 在训练完后,它能够给出哪些feature比較重要。

  • 在创建随机森林的时候,对generlization error使用的是无偏预计,模型泛化能力强。
  • 训练速度快,easy做成并行化方法。
  • 在训练过程中,能够检測到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=1NmxiRmI(yi=k)

分裂准则经常使用以下三个“误分类不纯度”、“Gini不纯度”、“熵不纯度”:

  • Misclassification error:1NmiRmI(yik(m))=1p^mk(m)
  • Gini index:kkp^mkp^mk=Kk=1p^mk(1p^mk)
  • Cross-entropy or deviance:Kk=1p^mklogp^mk

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

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

剪枝时。最经常使用的是“误分类不纯度”准则。另外,三个准则在2类分类时节点不纯度的函数图为:
不纯度
从图中能够看出“Gini不纯度”、“熵不纯度”可微,更适合数值优化。市场上流行的一种决策树CHAID使用一种基于统计χ2检验的属性选择度量。

其它不纯度度量包含C-SEP(在某些情况下。他比信息增益和基尼指数的性能好)和G-统计量(一种信息论度量,非常近似于χ2分布)(摘自《数据挖掘:概念与技术》P222)。

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

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

其算法例如以下:

Repeat until convergence {

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

标准梯度下降法由于是在全部训练样本误差的基础上更新每次參数,因此每一步的比随机梯度下降法走的大,由于它使用的是真正的梯度。

其缺点是每一步的计算量会非常大,非常容是产生锯齿现象,使得收敛速度慢,即一阶逼近函数得到的模型比較粗糙。

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

Loop {

for i=1 to n {

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


相对于标准的梯度下降法来说,随机梯度下降法每次迭代仅仅考虑一个训练样本,笔试严格意义上的梯度,因此下降比較小的步长,可是当训练样本比較大时,随机梯度下降发速度比較快。

另外,假设标准误差曲面有多个局部极小值,随机梯度下降有时更不easy陷入这些局部极小值中。

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

minw,b,ξ12w2+Ci=1Nξi

约束条件:
yi(wTxi+b)1ξi,i=1,2,,N

ξi0,i=1,2,,N

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

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

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

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

J(w)=argminwiL(yi,f(xi;w))+λΩ(w)

第一项L(yi,f(xi;w))衡量模型对第i个样本的预測值和真实值之间的误差。

由于模型是要拟合训练样本的,所以要求这一项最小,也就是要求模型尽量的拟合训练数据。但正如上面所言,不仅要保证训练误差最小。我们更希望模型尽量简单。所以须要加上第二项,也就是对參数w的正则化函数Ω(w)去约束模型尽量的简单。

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

L1范数是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。

L0范数是指向量中非0的元素的个数。

假设我们用L0范数来正则化一个參数矩阵w的话。就是希望w的大部分元素都是0。为什么不用L0,而要用L1呢?个人理解一是由于L0范数非常难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,而且它比L0范数要easy优化求解。总之。L1范数和L0范数能够实现稀疏,L1因具有比L0更好的优化求解特性而被广泛应用。

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

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

(2). 还有一个青睐于稀疏的理由是,模型更easy解释。

比如患某种病的概率是y。然后我们收集到的数据x是1000维的,也就是我们须要寻找这1000种因素究竟是怎么影响患上这样的病的概率的。假设我们这个是个回归模型:y=w1x1+w2x2++w1000x1000+b(当然了,为了让y限定在[0,1]的范围,一般还得加个Logistic函数)。通过学习,假设最后学习到的w就仅仅有非常少的非零元素。比如仅仅有5个非零的wi。那么我们就有理由相信,这些相应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这样的病仅仅和这5个因素有关。那医生就好分析多了。

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

为什么L2范数能够防止过拟合?

我们让L2范数的正则项w2最小。能够使得w的每一个元素都非常小。都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0。

而越小的參数说明模型越简单,越简单的模型则越不easy产生过拟合现象。

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:minw12yXw2,s.t.w1C

Ridge:minw12yXw2,s.t.w2C

也就是说。我们将模型空间限制在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.(拉勾网)哈希表中有哪些解决冲突的方法?拉链法是怎样的?
參考答案: 哈希法又称散列法、杂凑法以及keyword地址计算法等。相应的表称为哈希表。这样的方法的基本思想是:首先在元素的keywordk和元素的存储位置p之间建立一个相应关系f,使得p=f(k)。f称为哈希函数。创建哈希表时,把keyword为k的元素直接存入地址为f(k)的单元;以后当查找keyword为k的元素时,再利用哈希函数计算出该元素的存储位置p=f(k)。从而达到按keyword直接存取元素的目的。

当keyword集合非常大时,keyword值不同的元素可能会映象到哈希表的同一地址上。即 k1≠k2 ,但 f(k1)=f(k2)。这样的现象称为冲突,此时称k1和k2为同义词。实际中,冲突是不可避免的。仅仅能通过改进哈希函数的性能来降低冲突。

综上所述,哈希法主要包含以下双方面的内容:

  • 怎样构造哈希函数
  • 怎样处理冲突。

构造哈希函数的方法:

  • 数字分析法
    假设事先知道keyword集合。而且每一个keyword的位数比哈希表的地址码位数多时。能够从keyword中选出分布较均匀的若干位。构成哈希地址。比如,有80个记录。keyword为8位十进制整数d1d2d3…d7d8,如哈希表长取100,则哈希表的地址空间为:00~99。

    假设经过分析,各keyword中 d4和d7的取值分布较均匀,则哈希函数为:h(key)=h(d1d2d3…d7d8)=d4d7。比如,h(81346532)=43,h(81301367)=06。相反,假设经过分析,各keyword中 d1和d8的取值分布极不均匀。 d1 都等于5,d8 都等于2,此时,假设哈希函数为:h(key)=h(d1d2d3…d7d8)=d1d8,则全部keyword的地址码都是52,显然不可取。

  • 平方取中法
    当无法确定keyword中哪几位分布较均匀时。能够先求出keyword的平方值,然后按须要取平方值的中间几位作为哈希地址。这是由于:平方后中间几位和keyword中每一位都相关,故不同keyword会以较高的概率产生不同的哈希地址。
  • 分段叠加法
    这样的方法是按哈希表地址位数将keyword分成位数相等的几部分(最后一部分能够较短)。然后将这几部分相加。舍弃最高进位后的结果就是该keyword的哈希地址。详细方法有折叠法与移位法。

    移位法是将切割后的每部分低位对齐相加,折叠法是从一端向还有一端沿切割界来回折叠(奇数段为正序,偶数段为倒序),然后将各段相加。比如:key=12360324711202065,哈希表长度为1000。则应把keyword分成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)。
    在实际应用中,应依据详细情况,灵活採用不同的方法,并用实际数据測试它的性能,以便做出正确判定。

解决冲突的方法:

  • 开放定址法
    这样的方法也称再散列法。其基本思想是:当keywordkey的哈希地址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,假设下一个keyword为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个单元中,因而查找、插入和删除主要在同义词链中进行。

    链地址法适用于经常进行插入和删除的情况。
    比如,已知一组keyword(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+2n1n=1n

7.(一点资讯)设计一个栈。要求能在)O(1)时间复杂度内运行push,pop操作。而且能在O(1)时间复杂度内返回栈中的最小值。


參考答案:參考《剑指offer》面试题21。

8.(一点资讯)聚会中有10000个人,假设甲和乙是朋友,乙和丙是朋友,那么默认甲和丙也是朋友(传递性)。

如今给你5000个朋友关系对。同样的给5000个询问消息对,询问这些信息对中两者是否是朋友?算法复杂度是多少?

计算机网络

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

其它

1.(蘑菇街)先介绍一下自己。


參考答案: 各位老师。大家上午好,我叫***,是***大学自己主动化学院的硕士研究生,今年24岁,我来自湖北**。我想要应聘的岗位是数据挖掘project师或者机器学习相关的职位,之所以选择数据挖掘project师作为职业生涯的起点,一方面,是由于我对机器学习方向非常感兴趣。利用业余时间。我学习了相关的理论知识。还有一方面,今年我參加了阿里移动推荐算法大赛,积累了一定的数据挖掘实战经验,通过比赛使我对机器学习的理论有更深入的理解,而且我也意识到理论知识仅仅有应用到实践中才有意义。

在实验室的科研工作中,我主要研究的是康复机器人的智能控制算法,而且我在控制领域知名期刊上发表过英文的论文。

另外,在校期间。我学习成绩优异,曾两次获得***大学一等奖学金。

对于未来,我充满信心,也感受到了一定的压力。万丈高楼平地起。我希望自己能够在自己喜欢的岗位上找到属于自己的天空。

2.(蘑菇街)简介一下你的科研项目。


參考答案: 我主要研究的是康复机器人的智能控制算法,包含自适应控制。神经网络控制和模糊控制。

这些控制算法的目的是让康复机器人带动中风病人做康复治疗,使病人能尾随机器人完毕预定的动作轨迹,逐步恢复自主活动能力。这些算法要能够保证精确的位置控制,让病人能够更准确的完毕预先设定的动作。

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

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

posted @ 2017-07-17 16:49  wzzkaifa  阅读(1328)  评论(0编辑  收藏  举报