B站2021算法笔试题,选择题部分剖析三

作者 | 梁唐

出品 | 公众号:Coder梁(ID:Coder_LT)

大家好,我是梁唐。

今天我们接着之前,继续看B站2021算法岗校招笔试题选择题的最后一个部分。

题目来源于牛客网,感兴趣的同学可以点击阅读原文跳转。

第一题

分布式系统的CAP原则指分布式系统在三个要素中只能兼顾两点。下列不属于三要素中的是

这道题考察的是对分布式系统基本的了解,CAP是分布式系统当中的基本原则。

其中的C指的是consistency,即一致性,A指的是availability,即可用性,P指的是partition tolerance,即分区容错性。

事务性并不是CAP中的要素,别和数据库ACID四原则弄混。

第二题

对于n个带权样本的随机有放回带权采样,采样m次。最优时间复杂度为?

表面上来看,这题考的是时间复杂度,其实本质上是在考察算法。

加权有放回采样速度最快的算法叫做alias采样算法,它的时间复杂度分为两个部分,预处理部分和采样的部分。其中预处理部分的复杂度是O(n) ,每次采样的复杂度是O(1) ,加起来的复杂度是O(n+m) ,故选B。

简单介绍一下算法,显然,所有样本被抽中的概率和是1。算法上来会先对每一个样本的概率乘上N(样本总数),这样得到的概率和就是N。我们把每个样本的概率分布画出来:

其中有些大于1,也有一些小于1,但是均值肯定是等于1的。

接着我们把这个柱状图进行均摊,将长度超出1的部分分摊到其他柱上。确保每个小方格面积为1,并且每个小方格内最多只有两个样本,分摊之后得到的图如下:

这样一来我们会得到两个数组,一个数组存的是事件i占据比例prob,在这个例子当中就是[2/3, 1, 1/3, 1/3]。第二个数组存的是填充的样本编号alias,在这个例子当中就是[1, null, 0, 0]。

我们在采样的时候会出两个随机数,第一个随机数在0-n之间,用来选择列。第二个随机数在0-1之间,如果它小于prob[i],那么选择样本ii,否则选择样本alias[i]。

大家感兴趣可以算一算,看看这样得到的结果是不是符合预期。

第三题

关于机器学习中FM算法(Factorization Machines) 与MF算法(Matrix Factorization),以下说法正确的是?

这道题考察的是对FM算法和MF算法的理解。

这两个算法都涉及向量交叉,有一些相似的地方,存在一些迷惑性。其中FM算法核心思想是使用向量交叉来计算二阶参数的系数,是推荐系统中的经典模型。MF算法是用来分解大规模的矩阵,将一个长和宽都非常巨大的矩阵分解成三个规模更小矩阵的乘积,达到压缩存储空间,以及表示user和item向量的效果,也是推荐系统中的经典算法。

从目的上来看,两者的目的完全不同,可以排除选项A。

选项B很有迷惑性,它的前半句是正确的,FM算法的确引入了二阶交叉特征。但后半句不对,FM算法本身的初衷正是为了解决二阶样本过于稀疏的问题,所以B也可以排除。

C算法是正确的,FM算法给每一个特征赋予了向量,用向量之间的内积来计算交叉特征的权重,MF算法则将user-item的庞大矩阵拆解成user向量和item向量,都可以看成是一种embedding。

第四题

下面哪一方法可以判断出一个有向图是否有环(回路)

算法基础题,节点的度可以判断是否存在欧拉回路,最短路径可以求最短路径,但不能求出是否有环,同样也可以排除D选项。

拓扑排序可以判断是否有环,如果还存在节点入度大于0,但又找不到入度为0的节点,那么说明存在环。

第五题

机器学习训练时,Mini-Batch 的大小优选为2个的幂,如 256 或 512。它背后的原因是什么?

通过排除法也可以知道选B。

梯度下降算法的速度和mini-batch的奇偶性显然没有关系,不使用偶数损失函数不稳定也站不住脚,所以排除AC。

其实严格说起来B选项也有一点不太准确,因为主要不是为了符合内存要求,而是符合线程的要求,CPU或GPU的线程数都是2的幂。

总体来说这题不是非常严谨,可以忽略。

第六题

以下哪些是bert预训练时学习的任务?1. Masked LM 2. NER 3. NSP 4. Capitalization Prediction Task

bert基础题,奈何老梁不做NLP,也不知道……

正确答案是C。

第七题

在以下的哪一个数据集上,一般不使用 Hidden markov model?

隐马尔可夫理论题,了解隐马尔可夫模型的话会知道,它是一个针对序列的算法,含有一条可见状态链和一条隐含状态链。

其中股票的价格、每日访问用户数、中文分词之间都是序列数据,只有电影评分数据集完全是离散的,没有时序的关系。

故选B。

第八题

假设数据集的输入x和输出y均为实数,数据集中有三个数据点如下: {(x,y)}={(0,1), (1,1), (2,0)}。在线性回归模型(y=a+bx+noise)下, 使用留一法(Leave One Out)交叉验证得到的均方误差是多少?

这道题比较麻烦一点,首先我们要清楚什么是留一法。

留一法的意思是,将数据平均分成k份,每次用k-1份进行训练,留下一份作为验证,一共进行k次,这是一种解决训练样本不足的方法。

由于我们只有3条数据,所以对应每次会用2条进行训练,一条验证。首先是(0, 1), (1, 1),训练之后得到的模型为y = 0x + 1。在(2, 0)位置的误差是1。

第二次选择(1, 1), (2, 0),得到的模型为y = -x + 2。在(0, 1)处的误差也是1。

第三次选择(0, 1), (2, 0),得到的模型为y = -0.5x + 1,在(1, 1)处的误差是0.5。我们把这三个误差综合起来算均方差,也就是\frac {\sqrt{1^2 + 1^2 + 0.5^2}} 3 = 0.75 ,所以选C。

到这里这一次笔试的所有选择题就和大家盘点完了,三道算法题之前写过一道,还剩下两道,之后会抽一期文章一起写了。

总的来说,这个笔试的难度还是可以的,涉及的知识面以及难度都不算太低,甚至老梁这个老江湖都有不会的。如果分数要求高的话,想要通过可能也不是太容易。为了面试找份好工作辛苦准备,结果倒在笔试上实在是太遗憾了,老梁有过类似的经历,所以才会有写一写这些题解的想法。

尤其是这两年市场行情不是非常好,找工作不是一件容易的事,希望能够帮助到一些小伙伴吧。

感谢大家的阅读~

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...