ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

云从科技2020校招算法笔试:考点拆解与备战策略

云从科技2020校招算法笔试:考点拆解与备战策略 “云从科技2020校招算法笔试题”这个话题到现在还有学弟学妹找我要整理资料因为每年的考点延续性其实挺强的。2020年的这份卷子给我的印象很深它不是单纯刷 LeetCode 就能过的卷子也不是背背《剑指 Offer》就能糊弄过去的卷子而是把数据结构、机器学习、深度学习、数学基础和工程编码全部揉在了一套题里非常像一家做计算机视觉落地的 AI 公司对算法工程师的全部想象。这篇文章写给两类人一类是准备冲云从科技以及同类 AI 公司算法岗的人另一类是校招拿到笔试题却不知道怎么复盘的人。我会把 2020 校招算法笔试的题型结构、核心考点、典型真题思路、实战代码和避坑经验全部拆开讲尽量还原笔试现场那种“时间不够用、选择全靠排除法、编程题要抢分”的真实状态。1. 云从科技算法笔试题的整体设计与命题逻辑1.1 笔试题型分布与答题时间分配从 2020 校招的普遍反馈来看云从科技的算法笔试方式通常是线上统一笔试时长两个小时左右题型大致覆盖四类顺序不一定完全固定但比较常见的是前面选择题、后面编程题这种结构题型大致题量考察内容建议用时单选题15-20 题数据结构、算法复杂度、机器学习基础30-40 分钟多选题5-8 题深度学习、损失函数、优化器细节15-20 分钟简答/推导题1-3 题算法原理推导、模型为什么要这么设计20-25 分钟编程题1-2 题数据结构与算法实现、边界处理40-50 分钟这套结构放到 AI 公司身上非常合理。它的底层逻辑是算法工程师不是一个只会调包的人你需要有扎实的代码基本功去处理数据清洗、模型部署和上线工程也需要有足够的机器学习功底去设计模型和改进效果。所以选择题并不是随便考考编程题也绝不是压轴才出现的摆设。1.2 为什么算法岗会考这些内容这里我想先说一个很多校招同学容易忽略的事实云从科技的核心业务是计算机视觉也就是人脸识别、活体检测、行人分析、智慧城市相关的视觉方案因此它的算法笔试会明显偏向图像处理和深度学习但这不代表不考基础数据结构。从当时的一套回忆版笔试题看数据结构部分考了 KMP 算法、排序算法、图的最短路径、动态规划机器学习部分考了 KNN、SVM、决策树、聚类数学部分考了贝叶斯公式和矩阵特征值编程题则是一道典型的二分答案贪心调度题。你会发现它并不要求你掌握某个超级冷门的算法而是要求你在“常见算法不能只知道名字”这个层级上达到熟练。为什么因为视觉算法的日常工作中数据预处理阶段需要你写大量字符串处理和数组操作模型训练阶段需要你理解损失函数、梯度下降、过拟合模型上线阶段需要你具备工程思维把 Demo 变成稳定服务。笔试本质上是在用一套有限的题目快速筛选出这三方面都达到及格线以上的人。2. 高频数据结构和基础算法考点精讲2.1 字符串与 KMP 算法next 数组到底怎么算字符串相关题目在云从这类公司的笔试中出现频率极高因为日常工作中经常要和文件名、日志、标注信息打交道。那一年的笔试题里有一个很经典的 KMP 考点题干是对于模式串pabacaba其next数组next[i]定义为失配时模式串指针回退的位置是多少这道题其实有很强迷惑性因为 KMP 的 next 数组在不同的教材和不同语言实现里有不同定义方式。有的地方把next[i]定义成“最长相等前后缀长度”有的地方定义成“失配时下一次比较的位置”两者甚至还会出现一位偏移。我们先按最经典的“前缀函数”思路求一遍。前缀函数pi[i]表示p[0..i]中真前缀和真后缀相等时的最大长度长度为 1子串api[0] 0长度为 2子串ab真前缀a真后缀b不相等pi[1] 0长度为 3子串aba真前缀a等于真后缀api[2] 1长度为 4子串abac前缀和后缀没有相等的pi[3] 0长度为 5子串abaca前缀a等于后缀api[4] 1长度为 6子串abacab前缀ab等于后缀abpi[5] 2长度为 7子串abacaba前缀aba等于后缀abapi[6] 3。所以前缀函数数组是[0, 0, 1, 0, 1, 2, 3]。如果题目要求“失配时模式串指针回退的位置”很多实现里会把它整体右移并令第一个值为 -1也就是[-1, 0, 0, 1, 0, 1, 2]。这也就是为什么我建议做题时先在草稿纸上写清楚定义不要拿到题目就套模板否则很容易跟选项差一位。实操中还有一个容易踩的坑求 next 数组时不能每次暴力去比较所有前缀后缀那样时间复杂度会退化到O(n²)KMP 也就失去了意义。正确做法是使用递推核心伪代码如下def get_next(p): n len(p) pi [0] * n for i in range(1, n): j pi[i - 1] while j 0 and p[i] ! p[j]: j pi[j - 1] if p[i] p[j]: j 1 pi[i] j return pi这里while循环里回退到pi[j-1]是关键理解成“利用已经算好的信息跳跃前进”而不是老老实实从头匹配。笔试里如果考到 KMP这个理解比背代码重要得多。2.2 排序与查找别只背快排要懂稳定性与复杂度排序算法几乎是每份算法笔试题都绕不开的点但云从这套题的考察方式不是让你手写快排而是用选择题去抠细节。比如它问下列排序算法中哪些是稳定排序你是通过什么方式保持稳定性的这里很容易丢分因为很多人只记住了“冒泡、插入、归并是稳定排序选择、快排、堆排不稳定”但不知道背后的原因。稳定性指的是如果两个元素值相等排序后它们的相对顺序能否保持不变。冒泡排序和插入排序在相邻元素交换时遇到相等元素不会交换位置所以稳定选择排序会把最小值换到前面如果这个最小值是后面出现的重复元素就可能把相对顺序打乱快排的partition过程虽然可以实现为稳定版本但标准实现一般不稳定堆排序因为堆化过程中父子节点交换范围很大天然不稳定。还有一个高频考点是快排在什么情况下退化成O(n²)。答案是在每次 partition 都选到当前区间最小或最大元素时比如对已经有序的数组用固定取第一个元素作为 pivot 的朴素快排递归深度变成n每层比较次数还是n整体复杂度退化为O(n²)。所以工程上会用随机取 pivot 或三数取中法来避免这种情况。这种“复杂度为什么退化”的问题是笔试最喜欢的出题角度因为它要求你理解算法运行机制而不是背一个复杂度表。另外需要注意的是堆排序建堆的时间复杂度是O(n)而不是O(n log n)这个数学推导很多人不熟。它是通过对每个非叶节点自底向上做下沉操作总操作次数等于从第二层到叶子层所有节点的高度之和最终证明这个和是O(n)的。笔试如果考这个点千万别条件反射地写成O(n log n)。2.3 图算法与贪心Dijkstra、拓扑排序和并查集图算法也是 AI 公司笔试题里比较常见的部分毕竟很多业务都可以建模成图比如知识图谱、目标跟踪中的轨迹关联、传感器网络等本质上都需要图思维。Dijkstra 最常考的考点有两个第一个是为什么它不能处理负权边答案是 Dijkstra 的贪心策略假设“当前从起点距离最短的点已经不可能再被其他点更新”但负权边会打破这个假设使得后期发现一条经过负权边的路径反而更短第二个是使用优先队列最小堆优化后每次从堆顶取点并松弛邻居时间复杂度是O((VE) log V)也就是几乎每个点入队一次、每条边松弛一次堆操作每次O(log V)。拓扑排序也值得重视特别是在有向无环图 DAG 上判断任务依赖关系的问题。笔试里可能不给图而是给一堆任务依赖描述让你判断能否完成所有任务。本质上就是判断图里有没有环用 Kahn 算法维护入度为 0 的节点队列按顺序弹出并减少后续节点入度。如果最终入队节点数小于总节点数说明存在环任务无法完成。代码实现很简洁from collections import deque def can_finish(num_courses, prerequisites): indeg [0] * num_courses graph [[] for _ in range(num_courses)] for a, b in prerequisites: graph[b].append(a) indeg[a] 1 q deque([i for i in range(num_courses) if indeg[i] 0]) cnt 0 while q: u q.popleft() cnt 1 for v in graph[u]: indeg[v] - 1 if indeg[v] 0: q.append(v) return cnt num_courses这个题目的变体很多有时候会把课程名称替换成“任务并发执行所需的最少轮数”这时候就需要在拓扑排序时记录每个节点的层级而不是简单计数。写代码时注意初始化入度数组时要把所有依赖关系都处理完再遍历避免漏掉入度为 0 的节点。2.4 动态规划与递归从状态定义到滚动数组优化动态规划在算法笔试中的分量不用多说编程题十有八九有一道 DP。云从 2020 年笔试里的编程题虽然核心思路是二分答案但二分答案里嵌套的判断函数其实用了贪心而很多同学在考场上想直接 DFS 硬搜复杂度太高拿不到全部分数。动态规划的高频题型无非是背包问题、最长上升子序列LIS、最长公共子序列LCS、区间 DP、状态压缩 DP。以 LIS 为例经典dp[i]表示以第i个元素结尾的最长上升子序列长度转移方程是dp[i] max(dp[j] 1) 其中 0 j i 且 nums[j] nums[i]时间复杂度是O(n²)。如果要优化到O(n log n)可以维护一个d数组d[k]表示长度为k的上升子序列中最后一个元素的最小值然后对每个nums[i]在d数组里二分查找第一个大于等于它的位置。笔试时间有限时先写O(n²)版本能够保证正确性再根据数据范围决定要不要上优化版本。这里我教大家一个判断方法如果n是 1000 级O(n²)能过如果n是 100000 级必须上优化。另外很多 DP 题可以用“滚动数组”把空间复杂度从O(n²)降到O(n)。比如 LCS 问题中dp[i][j]只依赖dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]三格因此只需要保留上一行和一维数组即可。但我提醒一句笔试里空间复杂度常常不是重点时间复杂度才是决定生死的关键别为了滚动数组把一个好好的二维逻辑改得又乱又容易错。3. 机器学习、深度学习与数学基础考点拆解3.1 传统机器学习算法KNN、K-Means、决策树与 SVM机器学习部分进入选择题之后难度立刻上来了。题目一般不会让你直接写公式而是考你对算法特性的理解比如KNN 里的k选大了会怎么样选小了会怎么样如果k选得太大模型会变得过于平滑把很多本来不属于同一个类别的样本也拉进来投票容易欠拟合如果k选得太小比如k1模型对噪声非常敏感容易过拟合。除了k之外距离度量也很重要欧氏距离、曼哈顿距离、余弦相似度各有适用场景。文本向量场景下如果用欧氏距离向量的模长会对结果影响很大通常用余弦相似度更合理。这两个知识点在那年的多选题里都有出现。K-Means 也是一个重灾区因为它有几个很容易考到又容易记混的点初始中心的选择会影响最终聚类效果因此有了 K-Means 这样的初始化策略k需要提前指定因此选择k时常用肘部法则K-Means 对噪声和离群点敏感因为均值计算会把异常值拉向自己。还有一点是 K-Means 假设簇是凸的、大小相近的遇到不规则形状的数据分布效果往往不好这时可以用 DBSCAN 这种基于密度的聚类算法。这些细节如果只看过一遍科普文章现场很难答对。决策树部分主要考信息增益和基尼系数的计算。信息增益定义为熵的下降量Gain(D, A) Ent(D) - sum(|Dv| / |D| * Ent(Dv))基尼系数则越小越纯。选择题里经常给一个小样本数据集让你判断某个特征是否应该作为第一次划分的节点。这里有个小技巧如果出现一个特征把数据集切成了很多小分支但每个分支纯度提升不大那么它的信息增益可能反而不如划分更粗、但纯度提升显著的特征高。做题时不要凭直觉要动手算一下。SVM 考起来一般不喜欢考复杂推导而是考核函数的直觉和软间隔里C参数的作用。C越大模型对误分类的惩罚越大边界越窄越容易过拟合C越小对误分类越容忍边界越宽越容易欠拟合。这些特性在 AI 公司算法岗里几乎必考因为训练模型时的核心矛盾就是 bias 和 variance 的权衡。3.2 深度学习算法从损失函数到优化器作为一家视觉公司云从在笔试题里对深度学习的考察比重明显高于传统互联网公司。常见考点包括交叉熵损失和均方误差损失的区别分类任务为什么常用交叉熵这个问题在校招题里出现频率极高。原因可以从梯度角度解释如果用均方误差配合 sigmoid 输出它的梯度中含有sigmoid(z)这一项而 sigmoid 函数在两端饱和时导数值趋近于 0梯度消失严重模型更新非常慢交叉熵配合 softmax 或 sigmoid 能把损失函数的梯度推导成预测值 - 真实值的简单形式梯度传递效率高。所以工程上分类问题首选交叉熵回归问题才用均方误差。优化器部分也有几个容易踩坑的考点。Adam 为什么在训练初期表现很好、后期可能不稳定因为 Adam 使用指数滑动平均估计梯度的二阶矩如果某个维度梯度一直很小它的自适应学习率可能会变得很大而 SGD with Momentum 虽然调参更麻烦但泛化能力在不少任务里反而更好。这些细节在笔试多选题里经常作为干扰项出现光靠“Adam 就是最好的优化器”这种粗暴记忆完全行不通。还有一个很多 AI 公司都会考的点是softmax的数值稳定性问题。softmax公式里有exp(x)如果x很大比如等于 1000exp(1000)直接溢出。所以工程实现里通常会对输入向量减去最大值def stable_softmax(x): x x - np.max(x) exp_x np.exp(x) return exp_x / np.sum(exp_x)减去最大值不会改变概率输出结果因为分子分母同时缩放。这个知识点既是笔试选择题常客也是面试手写代码时的隐藏加分点务必记牢。3.3 数学基础与常用优化算法概率、线性代数与启发式搜索算法岗笔试的数学题看起来杂乱无章其实就集中在三个方向概率统计、线性代数、最优化思想。概率统计里最常考的就是贝叶斯公式P(A|B) P(B|A) * P(A) / P(B)题目通常会包装成一个疾病检测或样本分类的场景让求后验概率。这里有个易错点是分母P(B)需要按照全概率公式展开不能直接拿题目给的验证集准确率代替。线性代数部分特征值和特征向量是重中之重。PCA 降维本质上就是对协方差矩阵做特征值分解取最大的几个特征值对应的特征向量作为投影方向。之所以取特征值大的方向是因为特征值代表该方向上的方差大小方差越大说明数据在这个方向上区分度越高保留它也就保留了最多的信息。如果题目问你“特征值为 0 意味着什么”那就表示数据沿该方向没有变异可以完全丢弃。启发式搜索和常见优化算法也会以选择题或简答题形式出现。例如粒子群算法PSO的核心是让每个粒子根据自身历史最优位置和群体历史最优位置更新速度与位置模拟退火算法关键在于以一定概率接受更差的解这个概率随温度下降而越来越小从而帮助跳出局部最优。当时笔试有一道简答题就是让对比贪心算法和模拟退火算法的适用场景我的回答思路是贪心算法每一步都找当前局部最优优点是快缺点是容易陷入局部最优模拟退火通过引入随机性在搜索前期允许跳跃后期才逐步收敛。两者不是替代关系而是不同问题约束下的不同选择。3.4 图像与信号处理基础拉普拉斯算子与重采样既然云从做视觉图像处理基础自然也会出现在笔试题里。最常考的拉普拉斯算子一般有两个用途边缘检测和图像锐化。拉普拉斯算子是一个二阶微分算子卷积核常见如下0 1 0 1 -4 1 0 1 0它对图像中灰度变化剧烈的位置响应更强所以可用于提取边缘。图像锐化则常用原图像减去拉普拉斯变换结果相当于增强边缘对比度公式是g(x, y) f(x, y) - c * Laplace(f(x, y))注意这里“减去”还是“加上”取决于拉普拉斯卷积核中心是正还是负如果中心为 -4边缘区域经过拉普拉斯后是一个较大的负值所以要用f - c * Laplace如果中心为 4则要用f c * Laplace。这个符号问题特别容易在笔试中出成陷阱题做题时一定要看给出的核长什么样再决定符号。音频重采样算法也是一个低频但出现了就会让人懵的知识点。重采样的目标是改变采样率比如从 44.1kHz 变成 16kHz核心是插值。最简单的线性插值实现成本低但会产生频谱混叠工程上通常用带有限带滤波的抽取或插值结构所以实现时一定不能只做插值必须配合低通滤波器防止高频镜像。这个考点在纯互联网公司的笔试题里很少见但在涉及多模态业务的 AI 公司里就合理得多因为算法工程师可能会处理语音数据。4. 编程题实战思路与一段完整实现4.1 典型题目还原带截止时间的任务调度问题我印象里那场笔试的编程题跟任务调度有关描述大致是这样的有n个任务每个任务有一个最晚完成时间和一个收益完成每个任务需要单位时间每个时间点只能做一个任务求能获得的最大收益。乍一看这像一个经典贪心问题。标准解法是先按截止时间从小到大排序维护一个小根堆存储当前已选任务收益。当遍历到一个新任务时如果当前已选任务数小于该任务的截止时间就直接入堆否则比较堆顶最小收益与新任务收益如果新任务收益更大替换堆顶。这样堆里的任务就是最终要执行的任务集合收益之和就是答案。但笔试中这个题并不直接考贪心而是变成了“最大化完成的任务数”或“在给定时间限制内尽可能多拿分”所以很多同学会在 DFS 枚举和贪心之间犹豫。面对这种题我的建议是先观察数据范围如果n 20可以直接状态压缩 DP如果n到了10^5就直接上贪心加堆。4.2 完整代码与细节优化下面给出一段可直接提交的 C 版本用来处理“每个任务耗时 1 单位、求最大收益”的问题#include bits/stdc.h using namespace std; struct Job { int deadline; int profit; }; int main() { int n; cin n; vectorJob jobs(n); for (int i 0; i n; i) { cin jobs[i].deadline jobs[i].profit; } sort(jobs.begin(), jobs.end(), [](const Job a, const Job b) { return a.deadline b.deadline; }); priority_queueint, vectorint, greaterint pq; // min-heap for (const auto job : jobs) { if ((int)pq.size() job.deadline) { pq.push(job.profit); } else if (!pq.empty() pq.top() job.profit) { pq.pop(); pq.push(job.profit); } } long long ans 0; while (!pq.empty()) { ans pq.top(); pq.pop(); } cout ans endl; return 0; }这段代码有几个关键细节需要注意排序按截止时间升序保证每次处理新任务时堆里的任务都是“当前可安排”的小根堆里面只存收益不存截止时间因为截止时间已经通过入堆条件控制住了使用long long保存答案防止收益累加时溢出替换堆顶前需要判断pq.top() job.profit等于时不替换保持收益最大化。整个算法的时间复杂度是O(n log n)主要是排序和堆操作。空间复杂度是O(n)用于堆存储。笔试时如果时间紧张可以先写 Python 版本快速验证思路再翻译成 C 提交但一定要确保翻译时没有把排序比较函数写错。4.3 复杂度分析与会话式讲解在笔试复盘时我建议大家把每道题的“为什么这样设计”重新推一遍。以这个任务调度题为例贪心正确性的核心证明是交换论证假设存在一个最优调度方案和我们构造的贪心方案不同那么找到第一个不一致的任务位置用贪心方案中的任务替换原方案任务不会降低总收益并且仍然满足截止时间约束。这样可以反复替换最终说明贪心解等于最优解。笔试答题时不需要把严格数学证明写出来但要在代码注释或旁边写一句“使用小根堆维护已选最小收益保证堆内收益总和最大”给阅卷人看。这类题目在真实校招中出现率非常高因为它在题目描述上足够贴近业务场景比如视频分析任务调度、GPU 资源分配、模型训练任务排队本质上都是这个模板。所以大家刷题时不要只想着“我见过这个题”要想着“这个题背后的模型是什么还能抽象成什么业务”。5. 备战云从科技笔试的实操策略5.1 考前 30 天的刷题计划如果你现在还有一个月时间备考我建议参考这个节奏而不是一上来就刷难题。第一阶段第 1-10 天把数据结构基础算法全部过一遍。数组、链表、栈、队列、哈希表、树、图、堆每种结构至少手写一遍增删改查排序算法至少能手写冒泡、快排、归并、堆排字符串算法重点练 KMP 和常见匹配问题。这个阶段不要追求数量追求“能独立写出来”。第二阶段第 11-20 天主攻动态规划和贪心按题型分类刷比如背包问题做 10 道区间 DP 做 5 道状态压缩 DP 做 3 道贪心每天 5 道。同时穿插复习机器学习选择题考点建议把 KNN、K-Means、决策树、SVM、交叉熵、softmax 等知识点整理成一页速查表。第三阶段第 21-30 天做整套模拟卷严格限定 2 小时。重点训练时间分配和心态管理。建议把过去 3 年云从和同类 AI 公司的笔试真题都找出来做一遍不需要背答案而是总结高频题型的共性解法。5.2 笔试现场的时间管理与跳题策略线上笔试和面试不同没有面试官跟你互动只有倒计时和摄像头。我的个人策略是先花 1 分钟看完全部编程题如果编程题有思路就先写编程题如果编程题完全没头绪就先做选择题在做选择题的过程中偶尔切换回编程题利用潜意识思考。选择题最大的敌人是“犹豫”。一道题如果想了 2 分钟还没有任何把握先标记出来做后面的题等所有题目做完了再回来排除。多选题切忌任意猜因为多选、少选、错选往往都不得分。简答题不要写空话尽量画图和写关键公式哪怕推导不完整也要让阅卷者看到你的思路方向。还有一点非常重要在线编程题的环境一般不开启动态内存检查本地跑得好好的代码提交后可能因为数组越界、未读入完整输入而出现运行时错误。所以提交前务必检查循环边界和输入输出格式。一些平台要求最后一轮读入结束符比如CtrlD或 EOF 判断这在实际竞赛和校招笔试里都是常见扣分点。6. 笔试过程中的常见问题与避坑技巧6.1 做题时最容易被绕进去的点为了让大家快速自查我把那场笔试里最容易丢分的几个点整理成一张速查表易错点正确理解KMP next 数组下标偏移不同教材定义不同做题前先确认 next[i] 是“最长相同前后缀长度”还是“失配回退位置”快排时间复杂度平均为 O(n log n)有序数组固定取首元素时退化为 O(n²)堆排序建堆复杂度建堆是 O(n)之后 n 次取堆顶是 O(n log n)总复杂度 O(n log n)KNN 的 k 值k 太大欠拟合k 太小对噪声敏感softmax 溢出先减去输入向量最大值再做指数运算拉普拉斯锐化符号根据卷积核中心是正还是负决定是加还是减任务调度堆替换替换前要判断新收益是否大于堆顶等于时不替换这里我特别强调一点千万不要因为某道题见过就直接按记忆选答案。校招笔试题很喜欢把一个算法题目中的几个关键词换掉比如把“最长上升子序列”换成“最长不下降子序列”或者把“等于”换成“大于等于”这时候答案可能完全不同。我见过很多同学在 KMP next 数组定义、二分边界、排序稳定性这些看似简单的题上翻车原因就是没看清题干。6.2 在线笔试环境的坑输入输出与编译细节线上笔试题的输入输出格式经常成为隐性扣分点。比如 C 提交时如果没包含bits/stdc.h有些平台会编译失败还有 OJ 系统对main函数返回值不敏感但运行时错误会直接判 0 分。一个更常见的问题是题目要求多组输入但很多同学只处理了单组。判断方法是看题目描述里有没有“输入包含多组测试数据”这句话。如果有代码结构一般是while (cin n) { // process }还有输出格式要求比如“每个结果占一行”或“结果之间用空格隔开”提交前最好用题目给的样例数据跑一遍注意样例输出末尾有没有空行。空行问题看起来影响不大但在严格模式 OJ 上会报 Presentation Error导致判 0 分。如果用到浮点数输出建议设置足够的精度比如 C 里cout fixed setprecision(6) ans endl;如果不设置精度OJ 系统默认只输出 6 位有效数字很容易因为小数位数不足被扣分。这个细节我在真正的竞赛里吃过亏校招笔试同样适用。6.3 遇到完全不会的编程题怎么办总有同学问如果编程题完全没思路是不是直接放弃我的建议是不要交白卷把暴力解法写上去。很多 OJ 系统判分是按测试用例比例给分的O(n²)的暴力解法至少能过小规模数据拿到 20%-40% 的分值这比 0 分好得多。暴力解也有技巧。如果数据范围小可以写 DFS 枚举所有情况如果数据范围稍大可以考虑剪枝。剪枝的核心是用一个当前最优值去提前终止不可能成为最优解的搜索分支。比如在搜索任务调度时如果当前收益加上剩余任务最大可能收益都无法超过已记录最优值就立刻返回。剪枝算法在笔试中不会单独出名词解释但用在暴力解里能帮你多过一两个大数据用例。其实很多看似复杂的编程题只要你冷静下来把题面抽象成数据结构问题就会发现它并不难。比如“视频帧按时间戳排序”本质是归并排序“模型推理任务并行执行”本质是拓扑排序“动态规划替代搜索”本质是状态压缩。AI 公司出编程题不是为了故意难为你而是要看你面对陌生场景时能不能快速把它归约到已知算法。这种能力不靠考前突击靠的是平时刷题时多想一层“这题还能怎么换皮”。从我自己多次参加算法笔试的经历看云从科技 2020 校招算法笔试题的风格是“广而不偏”。它把数据结构、机器学习、深度学习和工程编码一张卷子全部覆盖表面上看很杂实际上每一道题都在检验一种确定的岗位能力。我那场笔试出来后的最大感受是想靠刷题技巧糊弄过去很难但如果你真的把一个算法理解透了不管题目怎么换皮都能找到入手点。最后分享一个我后来带学弟学妹经常强调的小技巧每次做完笔试题不要急着关页面把每道题考察的知识点回到你整理的知识框架里标出哪些是反复出现的哪些是你反复错的。校招笔试不是一次性战斗而是一个不断收敛错误的过程。你只要确保同一个坑不踩第二次下一场笔试的分数一定会比上一场高。
返回列表