尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

网易CV算法笔试卷全拆解:从KMP到目标检测的备考指南

网易CV算法笔试卷全拆解:从KMP到目标检测的备考指南 说一下我的初步判断这份“网易2018校园招聘计算机视觉算法工程师笔试卷”虽然已经过去几年但它的考点结构在校招CV算法岗里非常典型数据结构与算法、机器学习/深度学习基础、图像处理与CV专项再加上两道编程题。我当初备考时把这类试卷反复拆过好几轮也踩过不少坑今天就把这套卷子背后真正想考察的东西、每类题型的准备思路以及我个人的答题策略整理出来。不管你是正在投2025届秋招还是打算转行做CV算法这份拆解应该都能帮你省下不少瞎摸索的时间。这份试卷的难度说实话不算最变态的那一档但覆盖面很广而且喜欢在基础细节上做文章。很多人复习时只盯着CNN和目标检测结果一上来就被字符串匹配或者概率题打懵。下面我按考卷常见的模块顺序一个个拆开讲。1. 先看清这张卷子在考什么考点分布与出题逻辑1.1 一场笔试背后的岗位能力模型大多数校招笔试不是真的想让你在几十分钟内做出一个完整项目它更像一个“信号筛选器”。网易这场笔试面向的是计算机视觉算法工程师那么这个岗位日常要做什么读论文、复现模型、调bug、处理数据、优化推理速度偶尔还要写点工程代码。对应到笔试卷上就会出现三类交叉考察基础编程能力用代码解决具体问题考察的是你写代码的熟练度和边界处理能力。算法思维与数学功底考察你理解模型原理的深度而不是只会调包。CV专业深度考察你对图像特征、卷积网络、目标检测这些方向的掌握程度。这三块在试卷里不是均匀分布的通常编程题占30%到40%基础算法和数学选择填空占30%左右CV专项占剩下的部分。所以你会发现光会深度学习是不够的数据结构和概率统计那块一旦丢分太多总分直接拉胯。1.2 从热搜题看笔试命题的四个层次我在准备这份试卷时同步看了很多相关的热搜词和讨论帖比如“在KMP算法中对于模式串pabacaba其next数组”“图像锐化的拉普拉斯算法”“Sobel算法”“快速幂算法C”等等。这里其实藏着笔试命题的四个层次第一层是“背概念”。比如KMP算法、KD树、SIFT特征这些名词你得知道是什么。但笔试很少直接问“什么是KMP”它通常会丢给你一个具体模式串让你写出next数组。第二层是“推过程”。你不仅要记住结论还得能在纸上一步步推演。比如给定模式串手动计算next数组给定一组数据走一遍堆排序调整过程。这一层刷掉很多人因为平时都靠IDE跑不太习惯手推。第三层是“写代码”。给你一个题目描述要求在限定时间内写出可运行的代码并处理边界条件。这层考察的就是真实工程能力了。第四层是“综合设计”。比如“如何设计一个数据增强策略来提升小目标检测精度”这种开放题没有标准答案但能看出你的知识广度和工程经验。明白这四个层次之后复习就有的放矢了。接下来我们按模块逐个过。2. 通用算法题数据结构与经典算法的必拿分项2.1 字符串匹配与KMPnext数组不是背出来的当年网上不少人吐槽说这份试卷里出现了KMP相关的题目甚至有人直接拿着模式串“abacaba”问next数组。其实KMP在算法工程师笔试里出现频率非常高原因很简单字符串处理是日常写代码的基础而KMP又是考察“如何优化暴力解法”的经典模型。KMP的核心思想是当匹配失败时利用已经匹配的部分信息让模式串尽量多往后跳而不是每次只移动一个字符。这个“已经匹配的部分信息”就是next数组。很多教材直接给公式搞得大家只能硬背但只要你理解了一点就不需要背next数组记录的是“当前字符之前的子串中有多长的相同前缀后缀”。注意是“之前”通常不包含当前字符本身具体看题目定义。以“abacaba”为例我手把手推一遍规定next[0] -1也可以是0看题目约定网易常用的版本里next数组从-1开始。i 1字符是b它之前的子串是a没有真前缀后缀相同所以next[1] 0。i 2字符是a之前的子串是ab前缀后缀没有相同next[2] 0。i 3字符是c之前的子串是aba最长相同真前缀后缀是a长度为1next[3] 1。i 4字符是a之前的子串是abac没有相同前缀后缀next[4] 0。i 5字符是b之前的子串是abaca最长相同前缀后缀仍然是a长度为1next[5] 1。i 6字符是a之前的子串是abacab最长相同前缀后缀是ab长度为2next[6] 2。所以你最终得到next数组[-1, 0, 0, 1, 0, 1, 2]。如果题目约定next[0]0那所有值整体加1即可。这里有个实战技巧笔试时如果时间紧千万别去回忆模板你就在草稿纸上把前缀后缀列出来一个个比虽然慢但准确率极高。KMP的代码模板可以背但next数组的计算过程一定要会手推因为选择题里肯定会给一个具体字符串。2.2 排序与贪心高频但不白给排序算法在笔试卷里几乎是必考的。热搜词里有“冒泡排序算法C”“堆排序算法”“数据结构排序算法”这说明大家都关注。但笔试不会直接让你写个冒泡排序就完事它经常这样考给出一个初始序列问快速排序第一趟划分后的结果。问堆排序建堆之后数组长什么样。问哪些排序算法是稳定的哪些不稳定。我印象比较深的是堆排序。很多人觉得堆排序不就是建堆加调整吗但手写的时候很容易搞混“建堆”和“调整”的区别。我自己的记忆方法是建堆是从最后一个非叶子节点开始从下往上调整排序的时候是把堆顶和末尾交换然后从上往下调整每次调整的范围减一。拿一个具体序列比如[4, 10, 3, 5, 1]建大顶堆的过程就是先调整节点10最后一个非叶子然后调整根节点4最终得到大顶堆。这个过程你一定要自己动手画几遍光看是记不住的。贪心算法也经常出现但多半不是独立大题而是结合其他算法考比如区间调度、哈夫曼编码、最小生成树。贪心题的难点在于证明“贪心策略是对的”笔试一般不用严格证明但你要能解释为什么这样贪心是合理的。比如安排会议室每次选结束时间最早的这个策略为什么最优因为结束时间越早留给后面的活动空间越大。这种直觉解释就够了。2.3 快速幂、二分图匹配等进阶套路再聊几个热搜里出现的进阶算法它们不一定每次都考但一旦考了就是区分度最高的题。快速幂几乎属于必考点因为它太适合出成编程题了。题目可能是“计算x的n次方并对p取模”看起来简单但如果n很大暴力循环肯定超时。核心思路是二分把x的n次方拆成x的(n/2)次方的平方递归处理。这里有个小坑n为负数时需要先转成正数处理最后取倒数另外n可能很大要用long long。二分图匹配的HK算法也在热搜里可能和网易某道题有关。说实话校招笔试里考HK算法有点超纲但如果题目描述里出现了“配对”“最小点覆盖”这类关键词你要能反应过来是二分图匹配问题。这种题通常选手写匈牙利算法就够了HK是进阶优化笔试时间有限不建议优先学。我的建议是这类进阶算法你至少要能熟练掌握快速幂、并查集、前缀和/差分、滑动窗口这几个高频套路。它们的适用范围广代码量少性价比最高。3. 数学与机器学习基础被很多人忽视的隐形门槛3.1 概率统计与最优化算法工程师的底层语言很多准备CV的同学容易忽略数学题但其实网易这类大厂笔试卷里数学基础占比不小而且经常藏在机器学习题里。比如题目可能会问已知事件A和B独立P(A)0.3P(B)0.4求P(A∪B)。一个袋子里有3个红球5个蓝球不放回抽两次求第二次抽到红球的概率。给定一组样本的均值和方差求数据标准化后的方差。这些题本身不难难的是在紧张状态下不出错。我建议你把条件概率、贝叶斯公式、期望与方差这些基础概念再过一遍尤其是全概率公式和贝叶斯公式在机器学习里对应着朴素贝叶斯分类器的推导属于高频考点。最优化方面重点看梯度下降的几种变体批量梯度下降、随机梯度下降、小批量梯度下降。题目可能会问“为什么深度学习中常用小批量梯度下降而不是全批量”答案要点是全批量计算梯度准确但速度慢内存开销大单样本SGD噪声大收敛不稳定小批量兼具两者优点还能利用GPU并行。这种题没有标准答案但你需要踩中关键词。3.2 经典机器学习算法KNN、聚类、SVM不能只喊名字热搜词里有“KNN算法的应用能力包括哪三个方面”“聚类算法”“机器学习算法”这些词说明大家都在关注经典ML。笔试中常见考法KNN给定K值和距离度量判断一个新样本属于哪一类。这里要注意距离度量可以是欧式距离、曼哈顿距离、余弦相似度不同度量结果可能不同。KNN的“三个应用能力”包括分类、回归和异常检测有些人只知道分类丢分可惜。K-Means聚类给定初始中心迭代几次后中心坐标是多少。这个题也是手推题你得会算均值。另外要理解K-Means对初始中心敏感可能收敛到局部最优所以通常跑多次取最佳。SVM主要考概念比如支持向量是什么、核函数的作用、软间隔的C参数含义。不太会让你手推对偶问题但你要理解SVM的目标是最大化间隔。准备建议对于每个经典算法你至少要能回答三句话它解决什么问题核心原理是什么有什么优缺点这三个问题几乎覆盖所有选择题。3.3 那些看起来“不相关”的算法题粒子群、模拟退火、PID你可能在热搜里注意到“粒子群算法原理”“模拟退火算法”“PID算法在CRPS PSU Power的作用”这些词。乍一看和CV没关系但这类题偶尔会出现在笔试的“算法思维”部分考察的是你对不同领域算法的理解和迁移能力。粒子群算法PSO是一种群体智能优化算法灵感来自鸟群觅食。每个粒子有位置和速度通过跟踪个体最优和全局最优来更新。它和遗传算法一样属于元启发式算法用于求解传统梯度方法难以处理的非凸优化问题。笔试如果出一段描述让你判断用什么算法你要能认出这种“个体全局信息共享”的思路就是PSO。模拟退火算法则是借鉴金属退火过程以一定概率接受比当前解更差的解从而跳出局部最优。它的关键参数是初始温度、降温速率和终止温度。我考研时就背过这个框架后来在笔试题里见到“某优化问题可能陷入局部最优如何改进”我第一反应就是模拟退火或随机重启。PID算法虽然在自动化领域更常见但在CV任务里也有应用比如云台稳像、无人机跟踪。它考察的是你对比例、积分、微分三个环节的理解P是反应当前误差I是累积历史误差消除静差D是预测误差趋势抑制超调。这本身不是CV核心但懂了以后面试聊到机器人视觉结合时会很加分。说实话这类“边缘算法”不需要深耕你只要建立“算法地图”知道每个算法解决什么类型的问题考场上就能按图索骥。4. 深度学习与计算机视觉专项真正的分水岭4.1 图像特征与经典算子Sobel、拉普拉斯必须手到擒来热搜词里同时出现了“图像锐化的拉普拉斯算法”“Sobel算法”这基本说明该试卷有图像处理基础题。很多同学觉得图像处理是传统CV已经过时了但笔试偏偏爱考这个因为它是深度学习CV的前置知识。Sobel算子是一个一阶微分算子用于边缘检测。它有两个3x3卷积核一个检测水平方向变化一个检测垂直方向变化。比如水平方向核-1 0 1 -2 0 2 -1 0 1这个核为什么中间行权重是2因为Sobel在计算梯度时对中心像素的邻域做了加权平滑距离中心越近的像素权重越大既能检测边缘又对噪声有一定抑制。笔试常问用Sobel算子对某个3x3区域做卷积输出是多少这种题你只需要把对应位置相乘再求和注意不要翻转核Sobel不是严格意义上的卷积是相关操作但在实际实现中都不翻转。拉普拉斯算子是二阶微分算子常用于图像锐化。它的离散形式通常是3x3核0 1 0 1 -4 1 0 1 0有时候也会用含对角线的版本1 1 1 1 -8 1 1 1 1拉普拉斯算子的特点是旋转不变性因为它是各向同性的二阶导数。但缺点是对噪声敏感所以实际使用中常常先高斯平滑再拉普拉斯这就是LoGLaplacian of Gaussian的思想。笔试高频考点还有直方图均衡化、中值滤波、高斯滤波、Canny边缘检测流程。Canny的流程要背熟高斯滤波平滑、计算梯度幅值和方向、非极大值抑制、双阈值检测和边缘连接。这里面试官喜欢问“为什么Canny要双阈值”答案是高阈值确定强边缘低阈值用来连接弱边缘避免边缘断裂。4.2 CNN基础与图像分类基础概念不能丢分深度学习部分图像分类是必考的。你能押中很多题比如为什么CNN比全连接网络更适合图像因为局部连接和权值共享大大减少参数量同时保留了空间结构信息。池化层的作用是什么降采样、增大感受野、提供平移不变性同时减少计算量。常考的池化有最大池化和平均池化。1x1卷积有什么用改变通道数、实现跨通道信息融合、增加非线性在GoogLeNet和ResNet里都用到了。感受野怎么计算从最后一层往前推公式是RF_n RF_{n-1} (kernel_size - 1) * stride_accumulated。这个题特别爱考一定要会推。图像分类模型的发展脉络也要清楚AlexNet提出ReLU和Dropout → VGG使用小卷积核堆叠 → GoogLeNet引入Inception结构 → ResNet提出残差连接解决退化问题 → DenseNet用密集连接加强特征复用。笔试可能会问“ResNet为什么能训练得更深”关键就是恒等映射identity shortcut让梯度可以直通避免梯度消失。我备考时还遇到一个几乎每场笔试都会出现的题Batch Normalization的作用。它缓解了内部协变量偏移让每层输入分布相对稳定从而可以使用更大的学习率加快收敛还带有轻微的正则化效果。注意BN在训练时使用mini-batch的均值和方差推理时使用训练阶段累积的全局统计量这是一个大坑面试也爱问。4.3 目标检测与分割必考的开放题阵地目标检测在CV算法岗笔试里几乎必考常考的问题有两阶段检测器和单阶段检测器的区别。两阶段如Faster R-CNN先生成候选区域再分类回归精度高但速度慢单阶段如YOLO和SSD直接回归边界框和类别速度快但正负样本不平衡导致精度稍低。Anchor是什么它是预定义的一组不同尺度和长宽比的框用来作为目标检测的参考。RetinaNet提出的Focal Loss就是为了解决正负样本不平衡问题。IoU怎么计算交并比两个框的交集面积除以并集面积大于阈值才算匹配。图像分割常考语义分割和实例分割的区别。语义分割是对每个像素分类不区分个体实例分割区分同一类别的不同个体比如Mask R-CNN。还有上采样方法转置卷积、双线性插值、反池化。知识蒸馏、注意力机制这些也偶尔出现。处理这类大题我的方法是用“是什么-为什么-怎么用”框架来组织答案。比如问到FPN特征金字塔先解释它通过自顶向下和横向连接融合多尺度特征再说为什么可以提升小目标检测最后提一句在Faster R-CNN里的集成方式。这样即使不算完美也能让阅卷人看出你系统思考过。4.4 训练技巧与数据增强经验题是你和别人的差距除了模型结构笔试试卷里还会出现一些偏经验的题目比如“训练集很小你怎么防止过拟合”答案可以从数据增强、正则化、Dropout、预训练模型、早停、减小模型复杂度等角度展开。这里我想重点说说数据增强。热搜词里有“图像分类算法”“图像锐化”等都和增强有关。常见的增强有随机翻转、随机裁剪、颜色抖动、旋转、缩放、Mixup、CutMix等。笔试的开放题如果问“如何提升小数据集下的分类精度”你除了说增强还要提到用预训练权重做迁移学习以及使用交叉验证选择合适的模型。这种题没有标准答案但覆盖面越广分数越高。另外还有一个经常被忽略的考点模型参数量和FLOPs的计算。比如给你一个卷积层输入是HxWxC卷积核是KxK输出通道是C算参数量和计算量。参数量就是KKC*C如果带偏置就加C。FLOPs要考虑每次乘加运算的次数大概是输出特征图尺寸乘以参数量。这个属于硬核计算公式要记牢。5. 编程题实战从思路到AC的完整闭环5.1 做题顺序与时间分配不要死在第一题编程题在笔试卷中通常是压轴也是拉开差距的关键。网易的在线笔试一般是三道编程题难度递增时间大概60到90分钟。我个人强烈建议按顺序做但千万别在第一题上耗尽时间。拿到题目先看数据范围n是100还是100000直接决定你要不要用O(n^2)的算法。如果n 1000暴力可能没问题如果n 10^5必须想O(n log n)或O(n)。这是笔试老手的基本素养。时间分配上我习惯先用5分钟读题确认输入输出格式然后快速在草稿纸上列几个例子手动模拟一遍确保理解正确。写代码控制在20分钟左右留出10分钟测试边界。如果一道题15分钟还没思路果断跳过先把后面能拿的分拿了。5.2 一个典型动态规划题的完整推演为了让你更有体感我举个动态规划题的典型例子。假设题目是“给定一个整数数组求最长递增子序列的长度”。这是笔试高频题。暴力做法是枚举所有子序列判断是否递增复杂度O(2^n)显然不可行。动态规划解法是定义dp[i]表示以nums[i]结尾的最长递增子序列长度。初始化dp[i] 1因为每个元素自身就是一个长度为1的递增子序列。状态转移对每个i遍历所有j i如果nums[j] nums[i]则dp[i] max(dp[i], dp[j] 1)。最终答案是max(dp)。这个解法复杂度O(n^2)如果n是1000没问题如果n是100000就要用贪心二分查找维护一个tails数组让递增子序列的末尾元素尽可能小。这是从dp进阶到贪心的典型思维过程。笔试的时候你最好先写O(n^2)版本因为更容易写对。写完后再看数据范围如果超时可以优化为O(n log n)的二分版本。有些同学一开始就上二分版本结果边界条件写错反而丢分。稳一点先拿分。5.3 代码风格与边界条件细节决定AC率在线编程题不要求你写出工业级代码但至少要保证能编译通过、不崩、不超时。几个常见坑数组越界尤其是在循环里访问i-1或i1一定要加边界判断。整数溢出涉及乘法或累加时用long long。空数组/单元素数组很多题在这些边界上最容易出错先用特判处理。输入输出格式有的题要求输出带空格或换行严格按样例来。全局变量和局部变量初始值尤其是计数器别忘了初始化。另外我强烈建议平时练习时就用牛客网或者力扣的在线编译器因为它们的输入输出风格不一样。有的公司用标准输入输出有的用核心代码模式提前适应能节省不少时间。6. 实战复盘我踩过的坑和总结的避坑清单6.1 笔试中的三个“隐形扣分点”第一手推算法时习惯性跳步。比如求next数组我见过很多人直接写结果草稿纸上一片空白。阅卷/在线判题看不到草稿但你自己容易出错。所以笔试时哪怕时间紧张也要把关键推导写在草稿纸上减少脑内计算。第二公式记忆不清还不验证。比如Sobel算子卷积有人把核记反了算出来梯度方向反了。我的习惯是拿到题先验算一遍拿一个最简单的全零图像中间一个亮点卷积后应该是正还是负这样能快速发现错误。第三开放题只答要点不展开。问“防止过拟合的方法”只写“数据增强、正则化”六个字肯定拿不到高分。你要每个方法都写一句原理或举例比如“数据增强对图像进行随机裁剪、旋转相当于扩大训练集降低模型对特定位置/颜色的过拟合”。这就体现出你真正理解了。6.2 备考资料与时间安排建议很多同学问我要不要刷LeetCode。我的建议是刷但要有针对性。你可以把LeetCode按标签刷优先刷数组、字符串、哈希表、动态规划、二分查找、双指针这几类它们在校招笔试出现频率最高。树和图相关的题也要会基础操作但不用刷太偏。另外一定要刷牛客网上的企业真题因为在线笔试的输入输出和LeetCode核心代码模式不一样很多时候是“处理一行字符串按逗号分割成数组”。如果你不熟悉Scanner或split用法很容易卡死。时间安排上我建议用三周周期第一周复习数据结构和经典算法每天写3-5道LeetCode基础题重点是DP和字符串。第二周复习机器学习和深度学习基础整理笔记动手推一推KMP、Sobel、BN等高频考点。第三周刷完整套模拟笔试掐时间做题适应节奏同时查漏补缺。笔试前一周每天只做一套模拟题保持手感不要再学新知识。6.3 面试衔接笔试之后怎么准备笔试通过之后紧接着就是面试。笔试里考的知识点面试中会问得更深。比如笔试考了KMP的next数组面试就可能问“KMP和BM算法的区别”“为什么KMP是O(nm)”。笔试考了Sobel算子面试就可能问“你项目中用过哪些边缘检测算子为什么选Canny”所以笔试备考时的知识清单直接可以作为面试复习的框架。我后来复盘发现真正让我通过面试的不是某个算法的细节记得多清楚而是我在笔试中把每道题都尽量理解到了“能给别人讲明白”的程度。这比刷题数量更重要。还有一个容易忽略的点笔试结束后最好把做错的、没做出来的题整理成错题本写清楚当时卡在哪一步正确思路是什么。我电子笔记里大概记了100多道这样的错题后来面试聊到相关内容时经常能随手引用。这个内容后续还可以这样扩展如果你现在正在准备校招可以沿着“笔试考点-面试深挖点-项目经验”这条线继续深挖把笔试试卷当成一个知识图谱的索引而不是一份考完就扔的题单。这套方法我用了很久希望对你有帮助。
返回列表