ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

机器学习算法岗笔试高频考点解析:从KMP到推荐系统

2026/8/31 10:33:26 拓冰建站 浏览量
机器学习算法岗笔试高频考点解析:从KMP到推荐系统 唯品会2018校招机器学习、算法笔试题B卷这个名字放在现在看确实有些年头了。但说实话互联网公司校招笔试的出题套路变化远没有大家想象得那么大。尤其是机器学习、算法岗核心考点翻来覆去就是那几块数据结构与算法基础、机器学习理论、概率统计、业务场景题。这套B卷我印象挺深不是因为题目本身有多难而是它的覆盖面非常典型几乎把算法岗笔试应该问的东西都问到了。如果你现在正在准备校招或者打算跳槽去互联网公司做算法方向这套题的参考价值依旧很高。这篇文章我会站在一个经历过多次校招、也参与过笔试命题的从业者角度把这套卷子的出题逻辑、核心考点、易错点以及对应的备考思路完整拆一遍。不是简单报答案而是告诉你每一类题到底在考什么、为什么这么考、以及怎么准备才能拿分。内容会偏干货实践适合正在刷题备考的同学也适合想系统梳理机器学习基础知识的读者。1. 试卷整体布局唯品会B卷到底在考什么1.1 考察板块与分值逻辑先说整体结构。从这类校招笔试题的普遍安排来看B卷一般会覆盖四到五个大板块计算机基础与数据结构、算法设计与分析、机器学习基础理论、概率统计与业务场景题有时候还会加一些编程实现题。唯品会这套卷子基本也是这个思路但它有几个明显偏向电商业务的特点后面我会单独说。一个重要的观察是笔试不是面试笔试的核心目的是在短时间内筛掉“基础不牢”的人。所以试卷里大部分题目并不会故意刁难你考的都是“应该会但很多人搞混”的知识点。比如快速排序的时间复杂度到底是多少、KMP算法中next数组怎么求、偏差和方差怎么权衡、过拟合怎么解决这些都是非常基础但极其容易翻车的问题。我见过不少同学机器学习模型调得挺溜TensorFlow/PyTorch用得也顺手但一做到理论题就懵。为什么因为平时都是直接调包很多底层原理没有真正理解。笔试考的就是你有没有吃透这些基础。所以备考的时候光刷代码不行理论必须补。从分值逻辑上看算法与数据结构通常占30%到40%机器学习基础占30%左右概率统计和业务场景题占20%到30%剩下的可能就是一些开放性的设计题。这个配比决定了你的复习顺序算法题是得分基本盘必须稳机器学习理论是区分度所在能不能进下一轮往往看这部分。1.2 为什么电商公司会这么出题唯品会做的是特卖电商核心业务围绕“人、货、场”展开。推荐系统、搜索排序、用户画像、销量预测、价格弹性分析这些都是算法团队日常要处理的问题。所以它的笔试题里机器学习部分不只会考通用理论还会结合业务场景出题。举个例子面试官可能不会直接问你“什么是协同过滤”而是会问“一个用户今天浏览了某品牌的女装但没有购买明天打开App你准备怎么给他推荐”。这种题表面上看是开放题实际上考察你对用户行为建模、特征构造、召回排序这些环节有没有完整认知。再比如电商场景下正负样本极度不平衡购买转化率可能只有百分之一甚至千分之一。那评估模型时应该用什么指标准确率能不能用这类问题在通用机器学习面试题里也很常见但在电商笔试里几乎是必考。另外电商公司对数据处理的敏感度很高。特征工程里怎么处理缺失值、怎么做归一化、怎么构造交叉特征这些点也经常出现在笔试中。它们看起来不难但恰恰是很多科班出身的人容易忽略的地方。所以我一直觉得准备这类电商公司算法岗笔试不能只抱着一本《机器学习》周志华死啃还要对业务场景有基本的体感。你没做过推荐系统没关系但至少要知道主要流程和常见方案。2. 算法与数据结构题套路固定拿分要稳2.1 KMP算法与next数组的两种定义KMP算法几乎是校招笔试题里的“钉子户”。好几套卷子都考了next数组的计算这套B卷里也有类似的题。KMP本身是个字符串匹配算法核心思想是当模式串和文本串在某一位失配时利用已经匹配部分的信息让模式串尽量右移避免从头开始比较。这个过程依赖的就是next数组。next数组怎么求很多同学记了又忘忘了又记就是因为没有理解它的本质。next[i]的定义是模式串前i个字符组成的子串中最长相等前缀和后缀的长度。注意是“最长相等前后缀”前缀不包含最后一个字符后缀不包含第一个字符。我举一个具体例子模式串 p abacaba。我们手动算一遍。先写下标的约定。如果下标从1开始next[1]固定为0。然后依次计算next[1] 0约定值next[2]看前1个字符 a最长相等前后缀长度为0所以next[2] 1。注意这里很多教材直接把next[2]写为1表示失配时从模式串第1位重新开始比较。next[3]看前2个字符 ab前缀有a后缀有b不相等最长相等前后缀长度为0所以next[3] 1。next[4]看前3个字符 aba前缀a等于后缀a长度为1所以next[4] 2。next[5]看前4个字符 abac前缀有a、ab、aba后缀有c、ac、bac没有相等的所以next[5] 1。next[6]看前5个字符 abaca前缀a等于后缀a长度为1所以next[6] 2。next[7]看前6个字符 abacab前缀ab等于后缀ab长度为2所以next[7] 3。所以在下标从1开始的体系下p abacaba 的next数组是 {0, 1, 1, 2, 1, 2, 3}。这里有个非常容易踩坑的点如果代码里下标从0开始next数组的定义会变。按照某种常见写法next[0] -1next[1] 0那么算出来的数组就变成了 {-1, 0, 0, 1, 0, 1, 2}。所以做题之前一定要看清楚题目约定的是哪种定义不然数组对不上答案全错。我当年备考时候的习惯是把两种定义都手推一遍然后总结成自己的模板。面试时不管题目用哪种下标约定都能快速切换。这个方法建议你们也试试。2.2 排序算法复杂度对比与快排优化排序算法也是笔试必考而且考法很多变。可能直接问你某个排序算法的平均时间复杂度和最坏时间复杂度也可能让你写出快速排序的实现还可能让你比较哪些排序是稳定的。这套B卷里就有一道关于排序算法复杂度的选择题。我把高频考点整理一下方便你们记忆排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n^2)O(n^2)O(1)稳定插入排序O(n^2)O(n^2)O(1)稳定选择排序O(n^2)O(n^2)O(1)不稳定快速排序O(n log n)O(n^2)O(log n)不稳定归并排序O(n log n)O(n log n)O(n)稳定堆排序O(n log n)O(n log n)O(1)不稳定这几个数字必须滚瓜烂熟。特别要注意的是快速排序虽然平均性能很好但在近乎有序的数组上如果选的基准值不巧会退化成O(n^2)。所以工程实现上一般会用“三数取中”或者随机选择基准值来避免这种情况。这里顺便分享一个笔试中很常见的扩展题如何在O(n)时间内找到数组中第K大的元素这个其实是快速排序的变种利用partition操作每次排除一半的元素。笔试时如果时间够可以把这个思路写出来比直接调用sort要更能展示算法功底。再补充一个易错点归并排序的空间复杂度是O(n)很多人会误写成O(log n)。归并过程需要额外数组来暂存元素这个空间不是递归栈产生的那个O(log n)而是合并时的O(n)。笔试题里经常拿这个来迷惑人。2.3 复杂度分析与边界条件除了具体的算法题笔试还会考一些复杂度分析的题。比如递归式 T(n) 2T(n/2) O(n) 的解是什么答案是O(n log n)也就是归并排序复杂度的由来。这个用主定理直接可以判断。再比如一个两层循环外层n次内层平均也n次那复杂度自然是O(n^2)。但有些循环的边界条件比较隐蔽比如for (int i 1; i n; i * 2) { for (int j 0; j n; j) { // do something } }这个复杂度是O(n log n)因为外层循环的次数是log n。做这类题的时候关键看循环变量的变化方式是递增还是翻倍每次循环范围怎么变。我见过很多同学在边界条件上翻车。比如二分查找的循环条件到底是 left right 还是 left right很多人在笔试现场突然犯迷糊。这种问题没有捷径只能在平时刷题时把每个模板的边界条件自己推一遍形成肌肉记忆。3. 机器学习基础题概念理解比背结论更重要3.1 偏差方差与正则化的关系机器学习理论部分偏差和方差是一道经典题。简单来说偏差衡量的是模型预测值的期望与真实值的差异方差衡量的是模型在不同训练集上预测的稳定性。高偏差对应欠拟合高方差对应过拟合。这个知识点在笔试里一般不会只考概念而是会结合正则化一起问。比如L1正则化和L2正则化的区别是什么为什么L1更容易产生稀疏解L1正则化之所以能产生稀疏解是因为它在损失函数里加的是权重绝对值的和。在最优解处L1的梯度在0点不连续所以更容易把某些权重直接压缩到0。而L2正则化加的是权重平方和梯度在0点连续权重会被压缩到很小但不会正好等于0。我用一个生活化的类比来解释假设你要在一个平面上找一个最低点L2正则化就像给平面加了一个向原点拉的弹性绳越远拉力越大但永远不会把你直接拉回原点L1正则化就像地面上了很多条沟沟底恰好经过坐标轴一旦滑进去就卡在轴上了。笔试里还有一道高频题解释岭回归和LASSO的区别以及在什么场景下选择哪种。这个问题其实就是L2和L1正则化的应用化版本。如果特征数很多而且你怀疑大部分特征其实无关紧要那用LASSO更合适如果特征之间相关性较高岭回归通常更稳。3.2 模型评估指标从精确率到AUC评估指标这块B卷也考了不少。核心概念包括精确率Precision、召回率Recall、F1分数、ROC曲线和AUC。精确率和召回率容易混淆。精确率是“你预测为正的样本里有多少真的为正”召回率是“所有真实为正的样本里你找回了多少”。用一个通俗说法假设推荐系统推了100个商品用户点击了10个那精确率是10/1000.1假设用户一共可能点击20个商品系统推的100个里包含了这20个中的10个那召回率就是10/200.5。在电商场景下精确率和召回率往往是矛盾的。提高召回率通常意味着要放宽阈值多推荐一些商品但这样精确率就降了。这时候就需要F1分数来综合平衡F1 2 * Precision * Recall / (Precision Recall)。还有一个更进阶的考点什么时候用PR曲线而不是ROC曲线答案是正负样本极不平衡的时候。ROC曲线的横轴是假正例率、纵轴是真正例率当负样本数量远大于正样本时假正例率会被“稀释”曲线看起来依然很漂亮但实际效果可能很差。PR曲线的横轴是召回率、纵轴是精确率对不平衡数据更敏感。电商场景下因为转化率很低所以评估模型时通常更关注PR曲线而不是ROC。AUC的定义也要搞清楚随机取一个正样本和一个负样本分类器给正样本打分高于负样本的概率。这个概率理解清楚了很多AUC相关的变形题就能应对。3.3 聚类算法与无监督学习无监督学习在笔试中出现的频率不如监督学习高但一旦出现聚类算法几乎是必考。K-Means是最经典的聚类算法考法包括K值怎么选、初始中心点怎么定、算法一定会收敛吗、K-Means和K-Means的区别。先说K值选择。最常用的方法是肘部法则画出簇内误差平方和SSE随K值变化的曲线找到一个“拐点”这个点对应的K就是比较合适的。但实际场景中肘部往往不明显所以还要结合业务判断。K-Means的初始中心点很影响聚类结果。标准K-Means是随机选K个点作为初始中心不同初始化可能导致不同结果。K-Means做了改进第一个中心点还是随机选但之后每次选新的中心点时距离已有中心点越远的样本被选中的概率越大。这样初始中心点能尽可能分散收敛更快、结果也更稳定。笔试还可能问一个很刁钻的问题K-Means一定收敛吗答案是会收敛。因为每次迭代都在最小化SSE而SSE有下界0所以算法一定会停。但注意它收敛到的是局部最优不一定是全局最优。另外一个值得注意的知识点是层次聚类和DBSCAN。后者基于密度可以发现任意形状的簇还能识别噪声点。笔试如果考到“如何聚类非凸形状的数据”答案一般就是DBSCAN或者谱聚类。4. 业务场景题唯品会风格的应用题4.1 推荐系统与协同过滤电商公司的笔试题里推荐系统基本上是不会缺席的。唯品会作为特卖电商每次大促期间给几百万用户推荐合适的商品是一个非常典型的业务问题。推荐系统最经典的算法是协同过滤分两种基于用户的协同过滤UserCF和基于物品的协同过滤ItemCF。UserCF是“和你相似的用户喜欢什么就给你推什么”ItemCF是“和你喜欢的商品相似的商品就推给你”。笔试怎么考最常见的方式是给你一个用户-商品评分矩阵或者用户浏览/购买记录让你手算一下两个用户之间的相似度或者两个物品之间的相似度。相似度的计算一般用余弦相似度或者皮尔逊相关系数。这里有个经验总结在电商场景下ItemCF通常比UserCF更常用。因为用户数量和兴趣变化都很快而物品之间的相似关系相对稳定。而且ItemCF的推荐结果更容易解释比如“因为你买了手机所以给你推荐手机壳”用户接受度更高。还有一个小细节协同过滤算法计算的是用户行为层面的相似度它不需要知道商品的具体内容属性。所以哪怕是一个全新的商品只要有了用户行为数据就能进入推荐链路。这也是协同过滤适合电商场景的原因之一。4.2 转化率预估与特征工程电商场景下另一个高频业务题是如何预测一个用户购买某个商品的概率。这个问题通常叫CVR预估是广告和推荐系统里非常核心的任务。CVR预估常用的模型包括逻辑回归LR、梯度提升树GBDT、因子分解机FM等。笔试不太会要求你推导FM的数学公式但会问为什么LR在工业界用得这么久为什么后来GBDTLR的组合效果更好LR的优势在于简单、可解释性强、训练快、方便在线更新。GBDT的优势在于能自动发现特征之间的非线性关系和交叉组合。LRGBDT的组合简单说就是先用GBDT做特征变换把原始特征映射到叶子节点的组合再把这些结果作为新的特征输入LR。这样既保留了LR的效率又增强了非线性表达能力。特征工程部分会考察用户侧特征、商品侧特征、上下文特征分别有哪些用户侧包括性别、年龄、历史购买金额、浏览品类分布等商品侧包括价格、品牌、品类、销量、库存上下文包括时间、星期、是否节假日、当前活动类型等。构造交叉特征时常见的做法是“用户历史点击品类”和“当前商品品类”做匹配特征这个特征在推荐场景中往往比单一维度的特征重要得多。数据缺失问题也很常考。比如某个特征缺失率达到60%该直接删掉还是填充一般思路是如果特征重要性和业务含义都不强可以直接删如果特征很重要就要分情况填充。填充方式有均值、中位数、众数或者用模型预测缺失值。但要注意测试集和训练集的填充策略必须一致不能训练集用均值、测试集用中位数否则会有数据泄漏和分布不一致的风险。4.3 冷启动问题的常见解法冷启动问题在电商场景下特别突出新用户没有历史行为新商品没有点击数据推荐系统很难给出高质量结果。笔试里如果出开放题冷启动的概率很高。解法大概可以从几个角度回答第一用户冷启动。靠注册信息做粗粒度推荐比如性别、年龄、城市、设备型号。还可以引导用户做一些初始的兴趣选择像很多App新用户注册时会让选感兴趣的分类标签。第二商品冷启动。靠内容属性来做相似度计算比如新款衬衫和平台上已有的衬衫在品牌、版型、价位、面料等属性上相似就直接利用这些商品之间的内容相似度进行推荐。同时可以给新商品一定的探索流量用点击反馈快速学习。第三用一些通用策略兜底比如热门推荐、排行榜、编辑精选。这些策略虽然个性化程度不高但能保证新用户体验不差。开放题的回答套路是先分场景拆解问题再针对每个场景给方案最后说明方案的限制和可能的优化方向。能这样条理清晰地答出来即使方案不完美面试官对你的评价也不会低。5. 备考路线与实操建议5.1 知识体系怎么搭看到这里你应该已经意识到这类笔试考察的内容其实非常结构化。备考阶段我建议把知识体系分成四条线第一条线是数据结构与算法核心是数组、链表、栈、队列、树、图这六类结构以及排序、二分、双指针、递归回溯、动态规划、贪心这六类算法。校招笔试的代码题一般不超纲但要求熟练度非常高。第二条线是机器学习理论重点是《机器学习》周志华前9章的内容包括线性模型、决策树、神经网络、支持向量机、聚类、降维等。最好能做到合上书能把每个算法的原理、优缺点、适用场景口头讲一遍。第三条线是概率统计与线性代数常见的考点包括贝叶斯公式、期望与方差、最大似然估计、矩阵特征值分解、向量内积与余弦相似度。这些数学基础在机器学习题里经常作为隐含前置知识出现。第四条线是业务场景与应用包括推荐系统流程、排序模型、广告点击率预估、特征工程基础等。这条线不需要研究得很深但主流思路和术语都要知道。5.2 刷题和复习的节奏时间安排上我建议提前两个月开始准备不要临时抱佛脚。第一个月用来系统过知识点第二个月用来刷题和模拟。刷题平台建议用LeetCode重点刷Top 100高频题和经典题比如两数之和、最长公共子序列、二叉树遍历、反转链表等。这些题看起来基础但笔试里经常包装成新题型出现核心解法其实都一样。机器学习理论复习可以结合视频课和教材。吴恩达的《Machine Learning》适合入门周志华的《机器学习》适合建立完整理论框架李航的《统计学习方法》适合深入算法细节。三本搭配着看效率最高。另外一定要找目标公司近两三年的笔试题来做限时训练。笔试和平时刷题最大的区别是时间压力。一套卷子90分钟题量可能达到20甚至30道平均每道题只有3到4分钟。如果平时不模拟考场上很容易因为时间分配不当而翻车。5.3 笔试现场的时间分配我个人的建议是先快速扫一遍所有题目标记出会做和不会做的。从会做的题开始先拿稳这些分。碰到一道题卡了超过5分钟果断跳过不要恋战。选择题和判断题是拿分大头因为答案是客观的只要对概念掌握清楚基本是秒答。计算题和编程题集中时间攻。开放题控制在每道10分钟以内不要写太多字把要点写清楚即可面试官按点给分。还有一个小技巧如果试卷要求写代码但题目给的答题框不提供本地编译环境那就先在草稿纸上把思路和关键变量写清楚再誊写到答题框。避免边想边写导致代码混乱也方便检查。6. 常见问题与避坑经验6.1 next数组边界经常算错前面已经提过KMP算法的next数组有两种常见定义下标从0开始和下标从1开始算出来的数组不一样。很多同学不是不会算而是没看清题目的下标约定导致整道题全错。我的经验是每做到KMP相关题目时先在草稿纸上写上“下标从1开始next[1]0下标从0开始next[0]-1”然后再开始手算。这样可以从源头避免混淆。另外手算时不要跳步严格按照“看前i-1个字符的最长相等前后缀长度 1”的规则来。6.2 正则化理解偏差关于L1和L2正则化的区别很多同学只会背结论“L1稀疏、L2平滑”但一到解释为什么就说不清楚。笔试如果出简答题只写结论是拿不到全分的你一定要把几何解释说出来。更进阶的做法是用优化视角来解释加上L1正则化后目标函数在一个正方形约束区域内找最优解因为正方形的角点落在坐标轴上所以容易产生稀疏解L2正则化对应圆形约束区域最优解落在坐标轴上的概率几乎为0所以不会稀疏。另外注意面试官偶尔会追问“L1正则化不可导梯度下降怎么处理”这个时候要能想到近端梯度法Proximal Gradient或者坐标下降法。笔试可能不太会深挖到这个程度但了解底层机制是加分项。6.3 评估指标选择错误有很多场景下评估指标的选择本身就是题眼。比如正负样本极不平衡时准确率没有参考价值对排序任务而言直接看AUC或GAUC可能不够要结合业务看线上指标对点击率预估模型模型离线AUC很高但线上效果差这种情况在面试里也会被拿出来讨论。我建议把每个评估指标的公式、适用场景、局限性都整理成一张表。刷题时遇到评估类题先判断数据场景再选指标形成思维定式。6.4 编程题编译环境不熟笔试系统五花八门有的提供完整IDE有的只是一个文本框还有的需要自己处理输入输出。很多人平时用本地IDE调试惯了到了笔试的文本编辑器里连头文件都忘记写。平时刷题的时候建议至少每周有几次在纯文本环境下写代码不依赖自动补全和编译器提示。同时把常用算法的模板代码整理成自己的“代码笔记本”考前过一遍考场能省不少时间。再分享一个教训笔试编程题如果题目没有明确说明读取输入时尽量用标准输入输出不要自己指定文件路径。很多笔试系统要求代码从stdin读数据、往stdout输出一旦写错读取方式本地测过的用例也过不了。我在实际带新人和辅导校招的过程中发现这套卷子里暴露出来的问题其实不只是知识掌握程度的问题更多是“刷题方式”的问题。大家习惯在开源框架里写模型、调参觉得很熟练但一到手推公式、手算数组、手写快排就露怯。笔试恰恰就是专门考这些“手工活”的。所以我的核心建议就一句话准备笔试不要光靠眼睛看一定要动手算、动手写。把每个高频考点亲手过一遍形成肌肉记忆。这套唯品会B卷虽然年代稍远但考的知识点和出题风格在今天依然具有很高的参考价值。把这里面的内容吃透了再去做其他互联网公司的算法岗笔试题你会发现题目只是在换衣服内核其实都是同一套。最后再分享一个心得做题的时候不要求快先把条件看清楚。很多失分不是不会而是审题不仔细。比如“选择不正确的是”“下列说法错误的是”这类反向提问总有人因为惯性思维看走眼而丢分。哪怕到了高年级或者工作后养成先审题再动手的习惯都只有好处没有坏处。