这套2016年的题我印象很深,当时我正准备从传统BI转向数据挖掘方向,拿这套题当模拟练手,做完最大的感受是:它不像后来很多公司的题那样一上来就堆深度学习,而是非常扎实地考了一个数据挖掘工程师真正每天都要用的基本功——数据结构、机器学习原理、概率统计、SQL和业务思维。
很多人觉得2016年的题太老,没必要刷,但我的看法恰好相反。数据挖掘这个岗位,核心知识体系这几年并没有发生颠覆性变化。你今天去面试,可能面试官不问你SVM的核函数了,改问Transformer的位置编码,但LR的损失函数为什么用交叉熵、AUC和准确率的适用场景、用户留存率的SQL怎么写——这些问题八年过去了依然是高频考点。这套题的价值在于,它把数据挖掘岗应该具备的底层能力用一套紧凑的笔试完整呈现了一遍,结构非常清晰,几乎可以当一张“知识地图”来用。
本文就按当时这套题的考察逻辑,把这个岗位笔试的考察维度、典型题型、背后原理和备考方法一一拆开讲清楚。
1. 这套题为什么值得反复刷:一份2016年真题的含金量
1.1 从题目结构看360数据挖掘岗的真实画像
360的数据挖掘岗位,在2016年那个时间点,业务导向非常明显。搜索、安全、移动分发、浏览器、手机助手……这些产品线每天都在产生海量用户行为数据,数据挖掘工程师的核心任务就是从这些数据里提取用户画像、预测用户行为、优化产品策略。
这套笔试题的结构,大致是这样分布的:
- 数据结构与算法:约30%-35%
- 机器学习基础理论:约30%
- 概率论与数理统计:约15%-20%
- SQL与数据库:约10%-15%
- 业务场景与开放题:约5%-10%
这个比例透露出的岗位画像很清晰:这是一个既要求你有扎实的编程和算法功底、又要求你懂机器学习原理、还要能写SQL处理数据、最后还得有业务感觉的综合性岗位。你不一定是个顶级的算法竞赛选手,但你不能有太明显的短板。
1.2 当年的高频考点与当前考情的对照
我把当年这套题里出现过的考点和2024年前后我在面试候选人时观察到的考点做了个对照:
| 考察模块 | 2016年高频考点 | 当前面试高频考点 | 变化趋势 |
|---|---|---|---|
| 数据结构 | 数组、链表、二叉树遍历、动态规划 | 哈希表、堆、图、动态规划、贪心 | 对算法深度的要求小幅提升 |
| 机器学习 | LR、SVM、决策树、朴素贝叶斯、KNN | GBDT、XGBoost、FM、深度学习基础 | 从经典算法向集成学习、深度模型迁移 |
| 概率统计 | 贝叶斯公式、期望方差、常见分布 | 条件概率、极大似然估计、假设检验 | 基础部分几乎未变 |
| SQL | 留存率计算、分组统计、Join | 窗口函数、留存漏斗、AB实验取数 | 窗口函数的考察频率大幅提升 |
| 业务思维 | 用户流失分析、推荐策略设计 | 异动归因、增长实验设计 | 从“会算”到“会解读” |
你会发现,底层逻辑没变,变的只是载体。数据结构依然在考,机器学习原理依然在考,概率统计依然在考。所以这套题的价值,不在于它押中了多少原题,而在于它帮你把整个知识框架搭建起来了。
2. 数据结构与算法:笔试环节的硬门槛
2.1 数组、链表与字符串:基础题背后的复杂度思维
这套题在算法部分的考察,有一点非常明显:它不鄙视基础题,反而很喜欢在基础题上做文章。比如数组类的题目,常见的有:
- 一个有序数组,如何在O(log n)时间内查找指定元素?
- 给定一个数组,找出数组中第K大的数,要求时间复杂度尽可能低。
- 如何判断一个字符串是否是回文串?如果允许删除一个字符,如何判断?
这类题看起来简单,但每一道都有“暗坑”。比如“第K大的数”,最简单的做法是排序后取下标,时间复杂度O(n log n)。但如果你知道快速选择算法(Quick Select),平均时间复杂度可以降到O(n)。笔试里不会直接说“请用快速选择”,但会在题目条件里暗示“数据量非常大,无法全部排序”——这时候你的答案和只会排序的人的答案,含金量就完全不一样了。
排序本身也是高频考点。快速排序的复杂度分析、归并排序的稳定性和应用场景、堆排序在TopK问题中的优势,这些概念不能只会背结论,要能把推导过程讲清楚。比如堆排序,它的时间复杂度为什么是O(n log n)?“建堆”的过程为什么是O(n)而不是O(n log n)?这种细节恰恰是笔试中区分“背过八股”和“真懂”的关键。
2.2 树、图与动态规划:看你会不会“降维”处理问题
在这套题里,树的知识点主要集中在:
- 二叉树的先序、中序、后序遍历,以及如何根据两种遍历结果还原二叉树。
- 二叉搜索树的性质:中序遍历得到有序序列。
- 平衡二叉树(AVL)和红黑树的区别。
- 如何判断一棵树是不是另一棵树的子树。
图和动态规划的题目通常只出现1-2道,但一旦出现就是压轴题。最短路径、拓扑排序、0-1背包、最长公共子序列,这些是经典的不能再经典的题型。我当时备考的时候,把LeetCode上的高频题刷了两遍,但真正在笔试里遇到动态规划题时,依然会卡壳。后来我总结出一个经验:动态规划题的关键不是背状态转移方程,而是先学会判断“这道题能不能用DP”,再一步步推导状态定义和转移逻辑。
一个实用的判断标准是:如果一个最优化问题,存在“重叠子问题”和“最优子结构”,大概率可以用DP解决。什么叫重叠子问题?就是同一个子问题会被多次计算。什么叫最优子结构?就是整体的最优解包含子问题的最优解。用这两个标准去套,比看到题目就瞎想高效得多。
2.3 数据挖掘岗的算法题刷题优先级建议
如果把数据挖掘岗的笔试准备看作一个项目,那算法题这部分值得投入的时间不应该超过30%。因为数据挖掘岗的本质是“从数据中发现价值”,不是“写出更优雅的排序算法”。但在面试中,算法题又是快速淘汰候选人的手段——你算法题做不出来,后面再多的项目经验都很难挽回。
高效的做法是:
- 第一优先级:数组、字符串、哈希表、链表。这些是数据结构的基础,笔试中出现频率最高,刷80道经典题基本覆盖。
- 第二优先级:二叉树和递归。树的遍历、深度、路径问题一定要吃透,笔试考的概率很大。
- 第三优先级:动态规划、贪心、图。不要求全部掌握,但0-1背包、最长上升子序列、买卖股票的最佳时机这类经典模型需要会做。
- 第四优先级:高端数据结构(Trie、并查集、线段树)。只在时间富余时再看。
3. 机器学习基础:从“用过”到“讲清原理”
3.1 经典算法对比:LR、SVM、决策树、朴素贝叶斯的高频出题方式
这套题在机器学习部分的考察非常有代表性。它不会直接问“什么是逻辑回归”,而是会给你一个场景,然后让你选择用什么模型,并说明理由。这种题目背后考察的,是你对每个算法的适用范围是否真正理解。
逻辑回归(LR)几乎是必考题。围绕它的经典问法有:
- 逻辑回归的损失函数是什么?为什么用交叉熵而不用均方误差?
- 逻辑回归为什么适合做CTR预估?
- 逻辑回归怎么处理非线性问题?(答:特征交叉、核技巧、树模型+LR)
其中第一个问题就是典型的“看似简单、实则暗藏杀机”。你要知道,如果用均方误差作为LR的损失函数,损失函数变成了非凸函数,梯度下降很容易陷入局部最优;而交叉熵对应的损失函数是凸函数,有全局最优解。进一步说,从极大似然估计的角度出发,LR的损失函数本身就来源于伯努利分布的极大似然,不是“拍脑袋选出来的”。
SVM的考点则集中在:
- SVM的核函数有哪些?各自适用场景是什么?
- 为什么SVM对高维稀疏数据比较友好?
- 线性可分、线性不可分、非线性问题分别怎么处理?
有一个容易混淆的点是:SVM和LR都可用于分类,但在特征维度远大于样本量的时候,线性SVM往往比LR更稳定,因为SVM只关心支持向量,对全局分布不敏感;而数据稀疏、特征含义明确的场景,LR加L1正则往往更实用。这种对比类问题,回答时一定要把适用条件讲清楚,而不是直接说“SVM比LR好”。
决策树和朴素贝叶斯相对基础,但出题方式同样有套路。决策树常考:ID3用信息增益、C4.5用信息增益率、CART用基尼指数,三者各自偏好什么样的特征?朴素贝叶斯常考:为什么它叫“朴素”?因为它假设特征之间相互独立,当特征之间有明显相关性时,效果会打折扣。
3.2 损失函数、过拟合与调参:笔试喜欢挖的细节
在机器学习基础这部分,笔试特别喜欢考察“你只是在调包,还是真明白里面发生了什么”。
损失函数方面,除了刚才说的LR,还常考:
- 平方损失(回归问题)
- 交叉熵损失(分类问题)
- 合页损失(SVM)
- 对数损失(逻辑回归)
这几者的区别和适用场景,不能只背名字,要能把式子写出来。比如合页损失:L(y, f(x)) = max(0, 1 - y·f(x)),这个式子的含义是:当样本被正确分类且置信度足够高(y·f(x) >= 1)时损失为0,否则损失随置信度下降线性增加。理解了这一点,你就明白SVM为什么追求“最大间隔”——它不只是分类正确,还要求足够自信地分类正确。
过拟合这个概念的考察频率极高,几乎每年必考。与之配套的问题是:如何防止过拟合?标准答案大家都会背:增加数据量、正则化、Dropout、早停、交叉验证。但笔试会进一步追问:L1正则和L2正则的区别是什么?为什么L1能产生稀疏解?机器学习岗的候选人如果只回答“L1会把特征系数压到0”,但说不出L1正则对应的先验分布是拉普拉斯分布,L2对应高斯分布,那我基本可以判断他的实际经验有限。
调参方面,GridSearch、RandomSearch、贝叶斯优化这三者的区别也开始出现在当年的题目里。核心点在于:网格搜索在参数维度较高时计算量爆炸;随机搜索在同样的计算预算下往往能找到更好的参数组合;贝叶斯优化则通过代理模型逐步逼近最优参数,适合评估成本高的场景。
3.3 特征工程与评估指标:容易被忽视的送分题
特征工程是数据挖掘岗的核心工作,但笔试中很多人在这部分失分,不是因为不会,而是因为没有系统整理过。
常见的考察点:
- 特征归一化的方法:Min-Max归一化和Z-Score标准化的区别与适用场景。
- 类别特征如何处理:One-Hot编码、标签编码、目标编码的区别。
- 缺失值处理:删除、均值填充、中位数填充、模型预测填充的适用场景。
- 特征选择方法:过滤式(方差、卡方检验、互信息)、包裹式(RFE)、嵌入式(L1正则、树模型特征重要性)。
我当时就把特征工程整理成了一个完整的流程清单:数据清洗 -> 异常值处理 -> 缺失值填充 -> 特征构造 -> 特征变换 -> 特征选择。到了笔试现场,凡是遇到特征相关的问题,就按这个框架一步步答,基本不会漏点。
评估指标方面,分类问题必考混淆矩阵、精确率、召回率、F1、ROC和AUC。有一个高频陷阱题:在正负样本极不平衡的情况下(比如欺诈检测,正样本只有1%),应该用什么指标?答案是ROC-AUC或者PR-AUC都行,但要警惕——当负样本远多于正样本时,ROC曲线会显得过于乐观,此时PR曲线更能反映模型性能。这类细节,面试官就喜欢听你从“为什么不合适”的角度展开。
回归问题则常考MSE、RMSE、MAE和R²。有一个思考点:在存在离群点的情况下,MAE比MSE更稳健,因为MSE对误差做了平方,大的离群点会把损失拉得很大,导致模型过度拟合这些异常点。但如果你的业务场景恰恰需要对大误差进行重罚(比如预测销售额偏差50%和5%的严重程度完全不同),那MSE更合适。这类题目没有标准答案,考察的是你有没有“根据业务选指标”的思维。
4. 概率统计与SQL:数据挖掘的两翼
4.1 概率题的常见题型与贝叶斯陷阱
这部分题目在整套题中占比不高,但容错率极低——因为概率统计是机器学习算法的基础,答不好会直接拉低整体印象。
常见的高频题型包括:
- 一个袋子里有3个红球和2个白球,连续取两次(不放回),求两次都是红球的概率。
- 在某个疾病检测场景中,患病率为1%,检测准确率为99%,如果某人检测结果为阳性,他真正患病的概率是多少?
- 随机变量X服从均值为λ的泊松分布,写出其概率质量函数。
- 给定一组样本,写出其极大似然估计的推导过程。
其中第二题是最经典的“贝叶斯陷阱”。答案是50%左右,不是99%。因为患病率只有1%,检测准确率99%意味着有1%的假阳性率,所以10000个人里有100个真病人、99个健康人被误诊为阳性,阳性人群中真病人占比约100/(100+99)≈50.25%。很多人在笔试中想当然地写99%,就是因为没有把先验概率(患病率)代入贝叶斯公式。这个题考察的不仅仅是公式记忆,而是“能不能在不确定信息下重新计算概率”的统计思维。
4.2 SQL题:考察数据提取与拆解能力
SQL在这套题里的比重虽然不算高,但它是数据挖掘工程师的日常必备技能。笔试中出现的SQL题通常非常贴近业务,例如:
- 求用户表的留存率(次日留存、7日留存、30日留存)。
- 统计每个品类的PV、UV和人均浏览次数。
- 用SQL实现两个表的关联,并指出INNER JOIN、LEFT JOIN、RIGHT JOIN的区别。
- 找出满足某条件下连续登录3天以上的用户。
留存率的计算我推荐一个标准化写法:先构造每个用户的“首日活跃日期”作为基准,然后计算每个用户每个活跃日期与基准日期的差值,最后按差值聚合并除以首日用户数。
WITH first_active AS ( SELECT user_id, MIN(active_date) AS first_date FROM user_active GROUP BY user_id ) SELECT DATEDIFF(ua.active_date, fa.first_date) AS day_diff, COUNT(DISTINCT ua.user_id) / COUNT(DISTINCT fa.user_id) AS retention_rate FROM user_active ua JOIN first_active fa ON ua.user_id = fa.user_id GROUP BY DATEDIFF(ua.active_date, fa.first_date) ORDER BY day_diff;这段SQL的核心逻辑是:先找到每个用户的“出生日”,再看他们之后每一天是否还回来。思路清晰了,SQL写起来就不会乱。
4.3 核心分布的记忆点和适用场景
笔试中如果出现概率分布相关的题,通常是给你一个场景,让你判断属于什么分布。常见的有:
- 二项分布:n次独立重复试验中成功的次数(比如抛硬币10次,正面朝上的次数)。
- 泊松分布:固定时间或空间内事件发生的次数(比如一小时内到达服务台的顾客数、一篇文章中拼写错误的个数)。
- 正态分布:大量独立随机因素叠加的结果(比如身高、体重、测量误差),由中心极限定理支撑。
- 指数分布:两个独立事件之间的时间间隔(比如顾客到达的间隔、设备无故障运行时间)。
记忆这些东西不能靠死记硬背。我当时用的方法是:把每个分布和“生活场景”绑定起来。比如你每天在路口观察等红灯的车辆数,如果是“一分钟内通过的车辆数”,那是泊松分布;如果是“连续两辆车之间的时间间隔”,那是指数分布;如果是“100辆公交车中有几辆晚点超过5分钟”,那是二项分布。这样绑定之后,做题就是套场景,不用再去回忆定义。
5. 笔试之外的隐性考察:业务思维与临场节奏
5.1 业务场景题怎么答才不空泛
这套题的最后有时会有一两道业务场景题,比如:“某APP的次日留存率下降了5个百分点,你如何分析原因?”或者“给用户推荐内容时,怎么平衡点击率和用户长期体验?”
这类题没有标准答案,但高分回答通常有一个共同特征:结构清晰、逻辑完整、有数据思维。
我的答题框架是四步:
- 确认指标口径:次日留存率是怎么算的?是新增用户还是全量用户?分母和分子分别是什么?
- 拆分维度:把问题按渠道、版本、机型、地区、时间等维度拆开,定位下降集中在哪个子群体。
- 提出假设并验证:是新版本的影响?是渠道质量变差?是竞品上线抢走了用户?还是节假日效应消退?
- 给出建议:针对验证出的原因,提出可落地的动作。
这个框架在面试和汇报里同样好用。关键是让面试官看到,你不光会跑模型,还能在模型之外用逻辑和数据回答业务问题。
5.2 时间分配与做题顺序
笔试的时间通常不会太宽裕,特别是算法题,一紧张就容易卡壳。我自己的策略是:先做会的,再做可能要花几分钟想的,最后做完全没思路的。具体来说:
- 第一轮(5-10分钟):快速扫一遍所有题目,把会做的、计算量小的题先做掉,保证基础分拿到手。
- 第二轮(20-30分钟):做机器学习、概率统计和SQL题,这些题得分确定性高。
- 第三轮(剩余时间):集中攻算法题,尤其是动态规划和场景设计题,这类题即使不能完全做对,也要把思路写好,争取部分分。
- 最后一轮(5分钟):检查计算题的小数点、单位、概率是否落在[0,1]范围。
还有一个容易被忽略的点:主观题和场景题一定要写满,哪怕想法不成熟,也要把思考过程展示出来。这既是给面试官看的,也是给自己养成“输出型思考”的习惯。
5.3 从笔试到面试:这套题在面试环节的延伸价值
很多人做完笔试就把它丢一边了,这其实是浪费了最宝贵的复习素材。我当年在准备面试时,会把笔试里做错的每一道题都做一次“复盘闭环”:这道题考察的知识点是什么?我当时为什么做错?是知识点遗漏、是计算失误、还是读题不清?正确的解题路径是什么?有没有更优解?
比如我当年在LR损失函数那道题上吃过亏,就在复盘笔记里画了一张“LR知识树”:从LR的模型形式,到损失函数推导,到梯度下降更新公式,到正则化,到多分类拓展,到实际应用中的注意事项。后来面试时被问到LR相关的任何问题,我都能顺着这棵知识树迅速定位,回答得很有条理。这套题由此变成了一张查漏补缺的“体检报告”,价值远超一次笔试本身。
如果让我给准备数据挖掘岗位笔试的朋友一个建议,那就是:题目本身会过时,但题目背后考察的知识和应用能力不会过时。把每一次真题练习都当成知识体系的一次锚点,比盲目刷题有价值得多。