ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

小米算法实习笔试复盘:KMP与粒子群等高频考点详解

小米算法实习笔试复盘:KMP与粒子群等高频考点详解 笔试一结束我就知道这次小米的算法工程师实习岗基本凉了不是因为题不会而是因为会的没写完。整张卷子给我最大的感受是它不像是在考你会不会写代码而是在考你平时有没有真正理解这些算法的原理以及能不能在有限时间内快速做出正确判断。事后我把整份卷子逐题回忆了一遍再结合周围同学的反馈发现这份客观题其实暗藏了非常清晰的考点布局。如果你也在准备类似的算法实习岗笔试这篇文章值得你花十分钟认真看看尤其是KMP的next数组、粒子群算法这些高频考点我这次是真的踩了坑。1. 真题全景这份卷子到底在考什么如果把这份卷子的所有题目按知识点归类你会发现它并不像很多人想的那样全堆在“手撕代码”上。整份卷子由大约40道客观题组成题型包括单选、多选和判断覆盖了数据结构与算法、机器学习、深度学习、图像处理、经典智能算法、工程实践等多个方向。虽然它叫“算法工程师”岗但机器学习相关题目占据了至少1/3的篇幅这一点让我有点意外也让很多只刷LeetCode的同学当场翻车。1.1 题型构成与考点分布我根据考后回忆和同行交流把这份卷子的考点大概分成以下几类数据结构与算法基础排序算法、KMP、贪心、堆、二分图、快速幂、并查集等约15题机器学习与深度学习聚类、KNN、决策树、XGBoost、强化学习、生成模型等约12题智能计算与经典算法粒子群、模拟退火、卡尔曼滤波、PID、重组算法等约8题图像与信号处理Sobel算子、图像锐化、音频重采样等约5题从分值占比来看数据结构与算法、机器学习这两个方向是绝对的重头戏基本决定了你能否进入下一轮。这个分布也符合小米AI岗位的定位既需要扎实的计算机基础又需要对机器学习算法有真正的理解而不是只会调包。1.2 难度梯度设计整份卷子的难度是递进式的前10题相对基础比如冒泡排序的时间复杂度、堆排序的稳定性判断等热热身。中间10到25题开始上强度出现了KMP的next数组推导、粒子群算法的速度更新公式、贪心算法的反例构造等需要你真正理解原理。最后10题则是综合性较强的题目比如结合KL散度与ELBO的推导或者将PID算法原理应用到具体工程场景中。我个人的感觉是这套卷子不是要把你考倒而是要在短时间内区分出“背过八股文”和“真正理解算法”的两类人。很多题目只需换一个条件答案就完全不同如果你只是死记硬背结论很容易掉进陷阱。2. 数据结构与算法KMP、排序与贪心的考察方式这部分是整份卷子的地基也是我花时间最多的地方。因为客观题不像编程题那样可以循序渐进调试你要在没有任何IDE辅助的情况下直接根据概念和推导选出正确答案这对知识掌握的准确度要求非常高。2.1 KMP的next数组从定义到推导全过程这次卷子里有一道题让我印象极深它给了模式串pabacaba要求计算对应的next数组。题目里特别强调next[i]的定义但并没有把定义完整贴出来只是描述为“next[i]定义为当前字符之前的子串中最长相等前后缀的长度”这个描述其实是很模糊的。不同教材对next数组的下标起点定义不同有的从0开始有的从1开始这直接导致了完全不同的答案。我当时在考场上用了最稳妥的方式先手动把前缀表求出来再做整体右移并补-1。以abacaba为例它的前缀表最长相等前后缀长度如下子串a没有真前后缀长度为0子串ab前缀a后缀b不相等0子串aba前缀a和后缀a相等长度为1子串abac前缀a、后缀c不等前缀ab、后缀ac不等0子串abaca前缀a、后缀a相等1前缀ab、后缀ca不等前缀aba、后缀aca不等1子串abacab前缀a、后缀b不等前缀ab、后缀ab相等2所以是2完整串abacaba前缀a、后缀a相等1前缀ab、后缀ba不等前缀aba、后缀aba相等3所以是3所以前缀表为[0, 0, 1, 0, 1, 2, 3]。如果按“整体右移一位开头补-1”的KMP约定next数组就是[-1, 0, 0, 1, 0, 1, 2]如果按“直接使用前缀表”的约定next数组就是[0, 0, 1, 0, 1, 2, 3]如果按“整体减一”的约定则是[-1, -1, 0, -1, 0, 1, 2]。这道题真正的陷阱就在这里题目没有明确说采用哪种约定四个选项里出现了多个“看似正确”的答案。我在考场上选择了直接使用前缀表的版本但出考场后和同学对答案发现大家选的不一样原因就是各自学校教的KMP版本不同。这个题给我的教训是复习KMP时不能只记结论得把几种next数组的约定都弄清楚。2.2 排序算法稳定性与复杂度对比排序算法几乎是每场算法笔试的保留项目这次也不例外。卷子里有一道多选题要求选出“稳定且时间复杂度为O(n log n)”的排序算法选项包括归并排序、快速排序、堆排序、插入排序等。如果你只记得“快排平均O(n log n)”就很容易选错因为快速排序和堆排序虽然平均复杂度是O(n log n)但它们都不是稳定的排序算法。这里我帮大家整理了一份表格基本覆盖了笔试中会出现的所有排序算法对比排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序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 log n)O(n)稳定快速排序O(n log n)O(n^2)O(log n)不稳定堆排序O(n log n)O(n log n)O(1)不稳定希尔排序O(n log n)~O(n^2)视增量序列而定O(1)不稳定表中的快速排序最坏情况出现在每次划分都极度不平衡时比如对已经有序的数组使用固定基准退化为O(n^2)。很多同学只知道平均复杂度忽略了最坏情况这在选择题里是非常致命的盲区。另外卷子里还考了一道关于堆排序建堆过程的题给定一个序列要求判断建堆后的数组形态。堆排序虽然思路简单但很多人对siftDown和siftUp两个调整过程不熟悉容易在“从最后一个非叶子节点开始调整”这个细节上出错。我的建议是考前一定要亲手模拟至少两次建堆和堆排序全过程不要只背代码。2.3 贪心算法与二分图匹配的常见陷阱贪心算法在这次笔试中出现了两题。第一题是判断某个经典问题能否用贪心求解比如活动安排、找零钱、哈夫曼编码等只要了解贪心的适用条件——“局部最优能推出全局最优”就能回答。第二题则是给出一个具体的贪心策略让考生判断它是否正确这类题最考验对贪心局限性的理解。举个例子如果题目问“用贪心法求01背包问题每次选价值密度最高的物品是否一定能得到最优解”答案是否定的。因为01背包的约束是“物品不可分割”贪心选择价值密度最高的物品可能导致剩余容量浪费从而错过更优组合。这种反例在考场上需要你临时构造比如背包容量10物品A价值6重量5物品B价值5重量5物品C价值6重量6按价值密度贪心会先选A和C总重量11放不下只能选A和B总价值11但最优解是选B和C总价值11如果容量刚好能容纳B和C为10就能证明贪心失效。二分图匹配是另一个高频考点这次考到了HK算法也就是Hopcroft-Karp算法。它的核心思想是用BFS构建增广路径集合再用DFS在分层图中寻找增广路径从而将匈牙利算法的O(VE)复杂度优化到O(E sqrt(V))。我当时在复习时只关注了匈牙利算法对HK算法的了解仅限于“有这么一个优化”遇到具体题目时基本靠蒙。这里提醒大家投大厂的算法岗二分图匹配的匈牙利和HK算法都得掌握。3. 机器学习与深度学习概念题背后的原理追问如果你以为算法工程师笔试只考算法题那就大错特错了。这份卷子的机器学习部分占了相当大的比重而且考察的角度并不是“背出某个模型的公式”而是给你一个具体情境让你判断该用什么模型、模型会出现什么问题、应该如何调参。这种考察方式对真正做过项目的人很友好但对只刷理论题的同学来说每一道题都像在猜谜。3.1 聚类算法K-Means的局限与KNN的“能力边界”卷子里有一题直接问K-Means聚类算法的局限选项包括对初始质心敏感、需要预先指定K值、对噪声和离群点敏感、只能处理凸形簇等。正确答案是全选。如果你在实际项目里用过K-Means会深有体会初始质心的选择直接决定了最终聚类结果有时跑一次得到一个结果换个随机种子又得到另一个结果很不稳定。K-Means虽然能缓解这个问题但也只是降低坏初始化的概率并不能彻底根治。另外一题问KNN算法的应用能力包括哪三个方面这题考察的是KNN这个算法能做什么。KNN可以用于分类投票决定类别、回归取K近邻的均值/加权均值、以及异常检测计算点与K近邻的距离距离过大的点视为异常。很多人不知道KNN还能做回归因为平时接触的分类场景远多于回归场景。在笔试里这种“能力边界”类的问题很常见复习时不要只看算法最经典的应用要顺带了解它的变体和扩展。3.2 集成学习与XGBoost的工程细节XGBoost在机器学习岗的笔试中几乎是必考的这份卷子也不例外。有一道多选题考察XGBoost相较于GBDT的改进选项包括在目标函数中加入正则项防止过拟合、支持二阶泰勒展开加快优化、支持列采样以增加多样性、能自动处理缺失值。这四个选项全都是正确的但在考场上我发现很多同学只选了前两个因为教材上讲到XGBoost时重点突出“正则项”和“二阶导”对列采样和缺失值处理提及较少。这里多说一句XGBoost能自动学习缺失值的分裂方向在训练时会根据损失函数选择将缺失值分到左子树还是右子树在工程实践中非常实用。它支持列采样的思路借鉴了随机森林每次分裂时不是用全部特征而是随机选取一部分特征进行分割既降低了计算量又增加了模型的多样性。复习集成学习时建议把GBDT、XGBoost、LightGBM和CatBoost放在一起对比记忆尤其是它们各自对缺失值、类别特征、样本采样的处理方式这是大厂笔试的高频考点。3.3 生成模型从KL散度到ELBO的推导逻辑卷子最后出现了一道比较进阶的题涉及KL散度和ELBO的关系。很多同学看到“KL”和“ELBO”就放弃治疗了但其实这题考察的是一个非常经典的推导逻辑当我们用变分推断近似真实后验分布时直接优化KL散度不可行因为KL散度需要知道真实后验分布而这正是我们要求的东西。于是我们把KL散度做一个等价变换得到log P(X) ELBO KL(q(z)||p(z|X))因为log P(X)是与变分参数无关的常数最小化KL散度等价于最大化ELBO。我在复习时对这个推导过程反复推了几遍直到能自己默写出整个链条首先把log P(X)展开成log P(X, z) - log P(z|X)然后引入变分分布q(z)通过在分子分母同时乘除q(z)得到期望形式再分解出ELBO项和KL散度项。这个过程涉及期望、条件概率、KL散度的定义如果对概率论基础不扎实很难在考场上现推。建议准备这类题时把这一整条推导流程手写三遍以上形成肌肉记忆。4. 智能计算与工程算法粒子群、模拟退火与卡尔曼滤波这份卷子还有一个让我觉得非常有意思的板块它考了好几个通常在《智能优化算法》或者信号处理课程里才会出现的算法比如粒子群算法、模拟退火、卡尔曼滤波、PID算法等。这些算法在一般的算法刷题网站里几乎遇不到但它在小米的算法岗笔试里出现了而且题数不少。这说明大厂的算法工程师不仅需要会LeetCode上的经典算法还需要对工业界常用的启发式算法和信号处理工具有所了解。4.1 粒子群算法原理与速度更新公式粒子群算法PSO的题是我考场上比较有把握的一道因为它考的是最基础的速度和位置更新公式v wv c1r1*(pbest-x) c2r2(gbest-x)x x v。这个公式看起来简单但里面的每一项都有它存在的理由。w是惯性权重控制着粒子维持当前运动趋势的程度c1是认知系数表示粒子向自身历史最优位置学习的强度c2是社会系数表示粒子向群体历史最优位置学习的强度r1和r2是[0,1]之间的随机数用来增加搜索的随机性。笔试中常见的考法有两种一是直接问速度更新公式中某一项的含义二是给出一组参数让你判断粒子群算法的搜索行为会偏向开发还是勘探。比如w较大时粒子保持惯性运动的能力强有利于全局搜索勘探w较小时粒子更容易受个体最优和群体最优的影响有利于局部搜索开发。这类题目只要理解了每个参数的作用几乎不会出错。不过实际用PSO做工程优化时参数的调整比书本上的公式复杂得多。我记得自己在做一个调度优化问题时初始用w0.8、c1c22.0结果算法在前期收敛很快但后期容易陷入局部最优。后来我用了线性递减惯性权重策略让w从0.9逐渐降到0.4前期保持较强的全局搜索能力后期增强局部搜索能力效果明显改善。4.2 模拟退火的Metropolis准则与温度控制模拟退火算法的核心是Metropolis准则它以一定的概率接受比当前解更差的解从而帮助算法跳出局部最优。这道题在卷面上是一道概念题问“当新解比当前解差时接受新解的概率与温度的关系是什么”答案是温度越高接受差解的概率越大。这个结论来自Metropolis准则的公式P exp(-ΔE/T)其中ΔE是新解与当前解的适应度差值T是当前温度。当ΔE固定时T越大指数部分的值越接近0P越接近1。也就是说在高温阶段算法更像随机搜索在低温阶段算法逐渐退化为爬山法。这也是为什么模拟退火通常需要设置一个足够高的初始温度并且降温过程要足够慢否则算法很容易在高温阶段错失优质解区域或者在低温阶段过早收敛到局部最优。工程实践中降温策略的选择非常关键。常见的降温方式有线性降温、指数降温、对数降温等。指数降温T_{k1} α*T_kα通常取0.8~0.99是最常用的因为实现简单且α接近1时降温很慢算法在高温阶段停留较久有利于充分探索解空间。如果笔试中出现相关计算题通常会给定初始温度、终止温度和降温系数让你计算需要迭代多少代。4.3 卡尔曼滤波与PID的工程场景结合卡尔曼滤波在图像处理、自动驾驶、机器人导航中应用极广这次卷子里有一道概念题直接问卡尔曼滤波的应用场景。选项包括目标跟踪、信号平滑、定位导航、图像去噪等。这道题本身不算难但如果你没有实际用过卡尔曼滤波很容易在对“预测-更新”两个步骤的区分上出错。卡尔曼滤波的核心是贝叶斯滤波在线性高斯系统下的精确解分为两步预测步利用状态转移方程预测当前状态更新步利用观测值修正预测结果。它的一个关键参数是过程噪声协方差矩阵Q和观测噪声协方差矩阵R这两个矩阵的取值直接影响滤波效果。Q设置过大会导致滤波器过于信任观测值R设置过大会导致滤波器过于信任预测值。实际调参往往需要反复试错这也是面试时面试官喜欢追问的地方。另一道工程题考察PID算法在CRPS PSU Power中的作用这题看到时我愣了一下因为“CRPS”和“PSU Power”这两个词组合在一起听起来像是某个特定系统的电源管理场景。但仔细观察选项后发现它其实就是考察PID三个环节的作用P比例根据当前误差进行调节I积分消除稳态误差D微分预测误差变化趋势、抑制超调。在电源控制场景中PID算法通过不断调整控制量来让输出电压或电流稳定在目标值附近遇到负载变化时能快速响应并恢复稳定。4.4 图像与音频处理算法的客观题套路图像处理部分在这次笔试中占比较小但出现的题目都很典型。有一道题考Sobel算子问它主要用于什么操作。Sobel算子是一个离散微分算子通过计算图像灰度在水平方向和垂直方向的梯度来检测边缘所以答案是边缘检测。它做的是卷积运算用两个3x3的卷积核分别计算水平梯度和垂直梯度然后合成梯度幅值。还有一道题考图像锐化的拉普拉斯算法。拉普拉斯算子的原理是二阶微分算子它检测的是灰度变化率的突变点对边缘和细节非常敏感。图像锐化的常见做法是原始图像减去拉普拉斯运算结果或加上拉普拉斯运算结果的负值从而增强边缘对比度让图像看起来更清晰。音频重采样算法也出现在选项里这让我有点意外。重采样的本质是改变音频信号的采样率比如从44.1kHz转换为48kHz。常见的算法包括线性插值、三次样条插值、多相滤波等。客观题一般只会问“重采样的目的是什么”或“哪种插值算法质量最好”不大会深入考具体实现。5. 笔试复盘与备战策略考完这份卷子后我花了整整一个周末做复盘。客观题不像编程题那样有绝对的对错很多题目的答案取决于定义和约定因此复盘的关键不是记住某道题的答案而是搞清楚题目背后的概念体系。5.1 时间分配与做题顺序这次笔试的总时长大约是90分钟40道客观题平均每题只有2分多钟。我的建议是优先做自己擅长的模块把不熟的内容标记后跳过最后再回来处理。比如你机器学习比较熟可以先把这部分做完把不熟的KMP、粒子群等放后面。千万不要在卡壳的题目上死磕否则后面的送分题容易来不及做。客观题有一个明显的特征很多题目不需要精确计算而是可以通过排除法缩小范围。比如排序算法的稳定性判断你只要牢记“选择排序、快排、堆排序、希尔排序是不稳定的”这一条就能在大部分题目中排除至少两个选项。再比如KMP的next数组题如果能快速判断出题人使用的是哪种约定再按约定算出结果这道题就能稳稳拿下。5.2 高频公式与结论的记忆策略根据这次笔试的体验我整理了一份考前必背的核心结论清单分享给准备类似岗位的同学KMP的next数组理解前缀表并清楚不同约定下next数组的差异排序算法稳定性和复杂度表格快排最坏情况和堆排序建堆过程贪心算法适用条件以及经典反例01背包、部分背包的对比粒子群速度更新公式中每个参数的含义w对勘探/开发的影响模拟退火Metropolis准则、温度与接受差解概率的关系、降温策略卡尔曼滤波预测-更新两步走Q和R的含义PIDP消除当前误差、I消除稳态误差、D抑制超调聚类与KNNK-Means的局限性KNN的分类/回归/异常检测能力XGBoost相比GBDT的四个改进点KL散度与ELBO变分推断的核心推导链条考前如果能把这些内容熟练到“看到题目就知道答案出自哪个知识点”通过率会高很多。5.3 从笔试反推岗位的“能力画像”最后说一点我自己的体会。通过这套客观题其实可以反推出小米在招算法实习生时最看重的几种能力一是对经典数据结构与算法的扎实掌握不要求你会各种花哨的竞赛算法但常见内容必须理解透彻二是对机器学习常用算法的原理和适用场景有清晰认知能判断不同场景该用什么模型、模型可能有什么问题三是对工程中常用的算法工具如PID、卡尔曼滤波、粒子群有一定了解因为这些算法在真实产品中非常常见往往比深度学习模型更能体现工程功底。这次笔试虽然没有编程题但它对我的启发比很多纯手撕代码的笔试更大。它让我意识到算法工程师的核心竞争力不是会多少种模型而是能否在有限的时间内、有限的条件下基于对算法本质的理解做出最合适的判断。这种能力只靠刷题是远远不够的还需要在项目和实践中不断打磨。
返回列表