尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从蘑菇街算法笔试看电商算法岗:推荐、CTR预估与冷启动全解析

从蘑菇街算法笔试看电商算法岗:推荐、CTR预估与冷启动全解析 2018年秋天我在宿舍点开蘑菇街的实习生笔试链接时满脑子都是LeetCode。做完两道编程题之后发现真正让人冒汗的不是手写快排而是一道关于直播间商品点击率预估的开放题。这份被后人翻出来的“蘑菇街2019届实习生-算法工程师笔试试题”表面上是一份卷子实际上是一份电商算法岗的能力地图。如果你正准备投电商公司的算法实习或者想检验自己的知识体系有没有缺口这篇文章值得完整读完。我会从题型分布、典型题目拆解、业务场景答题思路、考场策略四个维度把我后来做面试官时同样会考察的东西一次讲透。1. 从一份笔试标题能读出什么蘑菇街到底想招什么样的实习生1.1 电商算法岗的“笔试”和“大学期末考试”不是一回事蘑菇街的定位是女性时尚内容电商核心业务里堆满了直播、穿搭社区、商品推荐、营销活动这些东西。可想而知它的算法团队日常在做的事基本绕不开推荐、搜索排序、商品理解、直播内容理解、用户增长和风控。实习生笔试不是学校里的“数据结构期末考试”不是把红黑树旋转写对就能拿高分而是公司用来做海选过滤的一道闸门在两个小时左右的时间里判断一个人能不能干算法工程师的活。“干算法工程师的活”这个标准听起来虚落到笔试里其实很具体。第一编码得干净边界条件不能漏第二算法基础得扎实不能只会调包第三机器学习基础概念要能写推导不能只背名词第四遇到业务开放题得能结构化地拆解问题而不是天马行空乱写。这四点里前三点是硬功夫第四点是区分度所在。蘑菇街这种电商公司尤其看重第四点因为它所有的算法最终都要落到“商品转化率提升”“直播曝光利用率提升”这些业务指标上。所以你看这份笔试虽然挂着“算法工程师”的名字但它的底层逻辑和纯互联网公司、纯研究型岗位都有点不一样。它更像是在问你能不能把学校里学的模型变成一套能服务几千万用户、几百万商品的系统里真正跑起来的东西。看懂这一层就不会再抱着“把LeetCode刷三遍就能过笔试”的心态去准备了。1.2 为什么总有同学觉得题目“偏”每年笔试结束都有同学在网上吐槽说好的算法岗怎么考了这么多业务题为什么LR的损失函数推导也写不够好为什么给了一道“直播间冷启动怎么做”的开放题我完全不知道从哪下手其实不是题目偏是很多人对“算法工程师”的理解太窄了。在学校做实验数据集是干净的评价指标是固定的模型跑完就能交差。但电商算法面对的是样本分布一天一个样正负样本比例可能到1:99线上效果和离线指标经常不一致。笔试里出现“样本不均衡怎么处理”“冷启动怎么做”“如何设计一个召回策略”这类问题就是在提前筛选那些具备工程直觉和业务 sense 的人。我后来参与过校招和实习生的笔面试出题发现出题人有一个共识不在乎你背了多少个模型名字而在乎你面对一个真实问题的时候能不能快速划出边界、给出可行方案、说清楚优劣取舍。这份“蘑菇街2019届实习生-算法工程师笔试试题”之所以到今天还被人翻出来讨论就是因为它把这种思路体现得很典型——通用算法题保底机器学习基础题拉开差距业务开放题决定上限。2. 编程题这些代码题怎么从“通过”变成“加分”2.1 常考的数据结构与算法题型分布电商算法实习笔试的编程题一般不会出特别偏门的算法但也绝不是LeetCode Easy难度就能应付的。从题型分布来看出现频率最高的是这几类题型常见问法建议最低掌握级别二分查找有序数组找目标、找旋转点、找边界手写不 bug 的二分链表反转、找环、合并有序链表指针操作熟练二叉树遍历、最近公共祖先、层序递归和迭代双写动态规划背包、子序列、编辑距离状态定义清晰排序与Top K第K大、前K个高频元素至少掌握堆和快排 partition字符串最长子串、匹配、滑动窗口滑动窗口模板如果你是2019年那一届当时的氛围普遍还停留在“刷题量决定一切”。但我后来复盘这套笔试时会发现它考的编程题并不追求偏怪难而是特别看重“在紧张状态下能不能把一道中等难度的题写对”。尤其是Top K、二分、DP这些话题几乎是必考。一个特别容易被忽视的方向是时间复杂度分析。很多同学能写出解法但被问“你这个复杂度是多少能不能再优化”就卡住。笔试不一定像面试那样问但你写出的代码复杂度过高在线判题系统会直接告诉你超时。所以准备阶段就得养成习惯每做完一道题顺手把时间复杂度和空间复杂度写出来对照题目给的数据范围算算会不会爆。2.2 一道“Top K”题目的四层解法递进有一类题目在电商算法笔试里出现率极高给定一个长度为 n 的整数数组返回第 K 大的数。它几乎是把“基础算法能力”和“工程优化意识”一起考了而且解法每上一层都对应着不同的思维层次。第一层直接排序然后取下标 n-K。代码最短但时间复杂度 O(n log n)。如果 n 是百万级在笔试环境里可能勉强能过但不是一个算法工程师该止步的地方。第二层用小顶堆维护当前最大的 K 个数。遍历数组时如果堆的大小小于 K直接入堆如果当前元素比堆顶大就替换堆顶。时间复杂度 O(n log K)空间 O(K)。这层解法已经在线性对数级别了而且在内存受限的场景下比如在海量数据里找 Top K堆是工程上真正常用的方案。第三层快排 partition 的思想。每次选一个基准把数组分成“大于基准”和“小于基准”两部分然后根据基准的位置决定继续在哪一侧搜索。这里有一个关键细节要求第 K 大分区时按从大到小排还是按从小到大排容易搞混。我的建议是先把“从小到大排”的 partition 写熟然后统一用下标转换第 K 大等价于排好序后下标为n-K的元素。下面是一个按从小到大版 partition 实现的写法import random def find_kth_largest(nums, k): n len(nums) target n - k # 升序排后第 K 大元素所在下标 def partition(left, right): pivot_idx random.randint(left, right) nums[pivot_idx], nums[right] nums[right], nums[pivot_idx] pivot nums[right] i left for j in range(left, right): if nums[j] pivot: nums[i], nums[j] nums[j], nums[i] i 1 nums[i], nums[right] nums[right], nums[i] return i left, right 0, n - 1 while True: pos partition(left, right) if pos target: return nums[pos] elif pos target: left pos 1 else: right pos - 1第四层是把它改成确定性 O(n) 的 BFPRT中位数的中位数但笔试时一般不建议写因为代码量大、常数大容易写得手忙脚乱。真正在笔试里拿到高分的写法是堆或者随机快排 partition然后准确说出复杂度。如果还想再加一点“工程感”可以补一句如果内存足够分布式场景可以先用 Hash 分桶再在每个桶内并行算 Top K最后归并。这句话未必会被判题系统验证但阅卷人看到会知道你不是只会背题。2.3 代码风格和边界条件才是分水岭很多同学觉得编程题只要最后样例跑过就行其实阅卷时除了看 AC还会看代码风格。尤其实习生的代码面试官会想象“三个月后他要进组跟我们一起写代码”代码乱不乱直接影响到这个想象是否成立。我自己在笔试踩过几个坑第一个是变量名全是 i、j、k回头检查代码时根本不知道哪个指什么第二个是完全没有边界条件处理比如数组为空、K 越界、输入有负数第三个是一上来就写复杂解法写到一半卡住最后连暴力解都没提交。聊了这么多届笔试我的建议是小规模数据先把暴力解写出来保证能得分再在暴力解基础上优化。过程中把边界条件写在最前面比如if not nums or k 0 or k len(nums): return -1这种防御式写法既不会扣分还能展示代码习惯。毕竟笔试是限时博弈最亏的不是不会做而是明明会做却因为“差一点点”没跑通。3. 机器学习理论题没背熟这些基础概念笔试直接翻车3.1 过拟合、正则化与偏差方差必考但不只是背概念蘑菇街这类电商公司的算法笔试机器学习题通常不会只问“什么是过拟合”而是会给出一个具体场景点击率预估模型在训练集上 AUC 0.85验证集上 AUC 0.72问可能是什么原因怎么定位怎么缓解。这种题目表面考概念实际考的是排查能力。我从阅卷角度说几个常见的失分点。第一只答“增加数据量”“加正则”没有解释为什么。第二不知道 L1 和 L2 的本质区别只会说“L1 稀疏L2 平滑”。如果能补上目标函数观感完全不一样。以线性模型为例L2 正则在优化目标里加的是 λ∑w_j²L1 加的是 λ∑|w_j|。因为 L1 在零点不可导且梯度方向恒为 ±λ所以容易把不重要的特征权重压成 0L2 的梯度是 2λw_j权重越小梯度越小最后会得到一堆绝对值很小、但不为 0 的权重。在电商稀疏特征场景下L1 能让特征维度变小、节省线上存储L2 更稳、但特征全保留两者各有各的用途。另外偏差和方差那个经典图笔试不会让你画但会用选择题问模型在训练集误差很小测试集误差大属于高方差还是高偏差答案是高方差对应过拟合。这类送分题一旦丢分会非常伤。因为它的背后是考官默认“这是基本功”你不是不会而是没复习到。3.2 排序模型从LR到FM再到深度学习电商算法的一个核心任务是排序所以和排序模型相关的题目也经常出现。常见问法包括LR 怎么做 CTR 预估FM 相对 LR 解决了什么问题DeepFM 为什么有效先说 LR。逻辑回归做点击率预估最基础的三板斧是特征离散化、特征交叉、在线学习。笔试如果考推导通常会让你写出预测函数和损失函数然后求梯度。预测函数记作h(x) 1 / (1 exp(-w^T x))损失函数是交叉熵Loss -1/m * Σ [ y log h(x) (1-y) log(1-h(x)) ]对 w_j 求偏导结果∂Loss / ∂w_j 1/m * Σ (h(x) - y) * x_j这个“预测值减真实值再乘特征”的梯度形式是 LR 在广告和推荐领域被大规模使用的重要原因之一计算简单更新快特别适合海量稀疏特征。能把这个推导写下来的同学在笔试里会比只会“import LogisticRegression”的同学高一个档次。FM 那个知识点也很典型。LR 本身不能自动学习特征交叉需要人工做二阶特征组合。FM 引入隐向量让每个特征学一个 k 维向量二阶交叉项的权重用两个向量的内积来表示这样就可以在稀疏数据下学到可靠的交叉权重。这个点经常以选择题出现FM 的时间复杂度是多少如果是朴素实现是 O(n^2 k)但通过数学变换可以优化到 O(nk)。能把这个问题讲明白的说明不是只看了名字。再往后就是深度学习模型从 Wide Deep 到 DeepFM、DIN问法通常是“侧边栏 Wide 部分的作用是什么”“为什么引入注意力机制”。这类题不用写公式但要能说出设计动机Wide 管记忆Deep 管泛化DIN 管用户历史行为和当前候选商品的相关性。答题时记住一个原则先说模型解决什么问题再说结构怎么设计最后说指标提升或业务收益。这就是标准的“算法答题三段式”。3.3 样本不均衡与评估指标电商场景最爱问的问题电商场景里点击率、购买率、复购率这些目标天然是正样本极少的。一份样本不均衡考题几乎必然会出现在笔试中。处理手段要能说全第一数据层可以欠采样、过采样、合成样本第二算法层可以修改损失函数比如给正样本更高的权重或者用 Focal Loss 让模型关注难样本第三后处理层可以调节阈值不一定要卡在 0.5。很多同学漏掉“阈值调节”这一步其实这恰恰是工程里最常做、也最有效的手段。评估指标的题目也很有迷惑性。问“用什么指标评估点击率模型”时如果回答 Accuracy基本就凉了因为负样本占绝大多数模型全部预测为负Accuracy 也可能很高。CTR 场景通常看 AUC、LogLoss或者分用户维度算 GAUC。更进一步如果能说出来“AUC 只关心相对排序不关心校准程度LogLoss 关心预测概率是否校准”那这个题基本就是满分。这种细节教科书写得少但线上模型迭代时天天都要用。3.4 特征工程题举例有些笔试会把特征工程专门拎出来比如给你一个任务预测用户未来 7 天内是否会产生复购。请你列出候选特征。这种题没有标准答案但答得有没有条理一眼就能看出来。我建议按四类来答亲测有效用户静态特征性别、年龄档位、会员等级、注册时长。商品特征商品类目、价格带、折扣力度、产地、品牌偏好强度。行为序列特征最近一次购买距今间隔、7 天内浏览/加购/收藏次数、点击商品的价格均值、历史复购周期。上下文特征当天星期几、是否大促期间、当前渠道、城市等级。最后再补一句连续特征要做归一化或分桶类别特征要做成 embedding 或 one-hot特征构造完之后要做离线验证。哪怕笔试只要求列特征也要把“怎么用这些特征”的逻辑带上这能证明你不只是会列变量而是真的会建模。4. 业务场景题当算法遇到直播、秒杀和“她经济”4.1 推荐系统“召回排序”的笔试开放式问题业务场景题最容易出现在笔试的最后一部分而且往往是最能拉开分数的地方。典型问法就是“请设计一个直播推荐系统”这种题看着很大其实是在考你脑子里有没有一套成熟的推荐系统框架。我的答题框架是固定的目标定义、数据层、召回层、排序层、重排层然后再补充冷启动和评估方案。目标定义要先说清楚是想提升人均观看时长还是想提升直播间成交额因为后续所有设计都会跟着目标变。数据层要说明有哪些输入用户信息、直播间的实时信息、用户历史行为、当前上下文。召回层写三到四种召回方式就够了基于用户观看历史的 I2I 召回、基于相似用户的 U2I 召回、基于直播标题和标签的向量召回、热门直播间兜底。排序层写一个精排模型比如 DeepFM 或者 DIN说明输入特征和输出目标。重排层要提多样性和打散避免用户看到全是同一个品类。最后补一句“用离线 AUC 做初步验证再上线做 AB 实验核心指标看人均时长和成交转化率”。这套框架写下来即便你没有真正做过推荐系统阅卷人也会觉得你的思维已经入了门。4.2 冷启动问题新品、新用户、新人主播冷启动几乎是电商算法笔试里的“必答题”。原因很简单电商平台每天都有新用户、新商品、新直播间没有行为数据模型很难给出靠谱的推荐。回答新用户冷启动我习惯分阶段讲。第一阶段利用注册信息做粗筛比如年龄段、城市第二阶段给用户展示热门内容和高探索价值的品类用“最热策略”保证基础体验第三阶段根据用户实时点击和停留反馈快速更新候选集用多臂老虎机这类在线探索策略给每个候选一个置信区间在“探索”和“利用”之间做平衡。提到汤普森采样或 UCB 时如果能补一句“Beta 分布的参数随点击更新”会显得非常专业。新品和新主播冷启动的思路类似但侧重点不同。商品没有行为数据但商品本身有类目、价格、图片、标题可以通过内容属性Embedding去匹配相似人群。直播间是实时内容可以设置一个“冷启流量池”先给一波曝光看点击率、停留时长、互动率超过阈值再往更大的池子里放。这就是熟知的“阶梯流量池”打法。笔试时把这个词说出来再加上“阈值要按直播间品类差异做校准”味道就对了。4.3 风控与反作弊的算法思路不是所有业务题都围绕推荐。蘑菇街这类电商平台大促、秒杀、优惠券发放场景下一定会有刷单、黄牛、垃圾注册这些问题所以算法笔试偶尔也会出一道风控题比如“如何识别刷单用户”。最容易被接受的答案是从规则和模型两个层面去答。规则层面单设备注册多个账号、多账号共用收货地址、下单时间分布过于均匀、退款率异常高等先拎出来做成黑名单特征。模型层面把用户、设备、支付账号、收货手机号、IP 地址作为节点建图用户和用户之间如果共享了太多关键节点就存在聚集风险。然后可以用图算法里的连通分量、标签传播或社区发现把“团伙”给挖出来。风控题还有个加分点讲清楚“准确率和误杀率”之间的取舍。宁可多放几个可疑用户也不要误杀正常用户尤其是大促期间误杀直接损失 GMV。这种“业务指标优先”的思考方式是最像真实算法工程师的地方。4.4 如何把开放题答出高分先说框架再补细节开放题最大的坑是没有框架就开写。我看到过不少卷子一上来就写“用深度强化学习”然后写一堆术语但完全没有交代输入输出也没有评估指标看完全篇不知道他想做什么。我总结了一个很稳妥的答题结构笔试时屡试不爽怎么定义问题目标是哪个业务指标评估指标用什么离线还是在线。数据从哪里来有哪些特征正负样本怎么定义数据量大概是什么级别。怎么做模型先给一个简单基线再给一个升级方案分别说明收益。怎么评估和上线离线实验、AB实验、灰度放量、监控指标。这个结构不需要长篇大论每部分三到五行就够了但胜在逻辑完整。开放题不是写论文是向阅卷人展示你的思维路径。就像写代码先写注释一样先把大框架搭起来再往里面填细节哪怕有些细节不一定准确也不会整体崩盘。5. 考场实战时间分配、做题顺序和那些踩过的坑5.1 题目结构与分值分布常见的实习生算法笔试形态虽然不同年份、不同岗位的试卷不完全一样但这类实习生算法笔试通常由三部分组成选择题、编程题、问答题/开放题整体时长在 90 到 120 分钟之间。选择题覆盖机器学习、概率统计、数据结构基础可能 10 到 20 道编程题通常是 2 到 3 道需要在线运行通过问答题一到两道偏业务开放。我见过最可惜的一种情况是同学在选择题上花太多时间结果后面编程题没做完。选择题一般 1 到 2 分一题分值不高但很耗时。如果你不确定某道概率题可以先标记最后再回来算。编程题分值高而且只要样例通过就能拿分优先级最高。开放题只要写就有分但得花时间组织。我给一个参考时间分配选择题控制在 25 分钟内编程题留 60 分钟开放题留 20 分钟剩下时间检查。当然具体要根据题目分值灵活调整但核心原则是不要在低分小题上恋战把时间留给高性价比的题目。5.2 我的做题顺序策略我做题喜欢“先易后难先把保底分拿到手”的顺序。进入试卷后先把所有题扫一遍不用逐字读只看题型和分值。然后从最有把握的编程题开始做或者从最容易拿分的选择题快速过一遍。编程题如果第一道比较难不要死磕立刻跳到下一道。很多同学在笔试时会犯一个“不写完不罢休”的执念结果第二道本来能拿分的题直接没时间碰。我的策略是同一道题先写暴力解保证样例能跑通拿到基础分如果时间还剩再在当前代码基础上加优化。这和平时刷题不一样笔试的目标是总分最大化不是单题最优解。另外通读题目时我会顺手把题目的核心条件圈出来比如“不能使用额外空间”“第 K 大而不是第 K 小”“有序但可能包含重复元素”。这些都是容易设坑的地方提前标记好写代码的时候就不容易忘。5.3 读题一半就开写是最大的坑笔试最大的坑不是不会做而是“没看清题就开写”。我见过太多同学把“返回前 K 个高频元素”看成了“按频率排序”把“求最长不重复子串”和“求最长回文子串”搞混写了大半天发现完全跑偏。这里分享一个非常笨但非常有效的习惯写完代码后不要急着提交先在草稿纸上构造一个最简单的测试用例手动推一遍输出。比如求第 K 大就构造[1, 2, 3, 4, 5]K2期望输出是 4。如果代码输出 2说明你在“升序/降序”或者“下标转换”上出了问题。这个习惯能挽救 30% 以上的低级失误。还有一个容易被忽略的细节输入输出格式。在线笔试平台对 Python 的input()读取方式有严格要求如果数据是多行数字很多人会卡在解析上。所以考前一定要去牛客网或者赛码网至少做两道完整的在线笔试模拟题把输入解析、输出空行这些“工程细节”提前练熟。这不是算法能力问题但的确会决定你能不能 AC。5.4 复盘这套笔试的参考价值每年都有大量同学问这些 2019 年的真题放到现在还有没有参考价值我的回答是题型和工具会变但考察底层能力的逻辑没有变。今天可能不考 LR 手推了改为考 Transformer 或者推荐里的多目标优化但“能否把模型原理讲清楚”“能否在业务场景里落地”“能否在压力下写出干净代码”这三件事依然是算法实习生的核心筛选标准。我后来参与出题时最常说的话是笔试本质上是给候选人一面镜子让他们照见自己知识体系里的盲区。所以不管这套笔试你最终拿了几分都值得做一次认真复盘。每道错题都对应一个知识点漏洞是概率论不熟还是机器学习推导没练够或者业务题没见过把这些漏洞列出来比单纯焦虑分数有用得多。如果让我回到 2019 年那个晚上重新做这套题我会在开考前做三件事把 LR 的梯度推导在纸上默写两遍把推荐系统的召回-排序架构背熟再给自己规定“每题先读题 2 分钟想清楚输入输出再动手”。很多年后我带实习生时发现这三件事依然管用。这套笔试真正的价值不在于你得了多少分而在于它逼着你把学校里学的散装知识真正装进“电商业务”这个壳里。祝你笔试顺利也祝你在复盘时能看见自己的成长。
返回列表