
我印象里奇安信2023春招算法方向的这份试卷算是安全厂商里比较有代表性的一套题了。很多人拿到手第一反应是“怎么这么杂”——既有KMP、排序这些经典数据结构题又有粒子群、模拟退火这类优化算法还夹着路径遍历、弱哈希这些带安全色彩的题目。这篇复盘我会按题型把考点拆开讲补上原理和手算过程最后给一份按优先级排的复习建议。不管你是准备投网安公司的算法岗还是单纯想看看安全厂商的笔试题长什么样这篇应该都能帮到你。1. 在动笔之前先看清奇安信算法岗的笔试到底想筛什么人1.1 安全公司的算法笔试和互联网大厂有什么不一样奇安信的主营业务是网络安全产品和服务比如终端安全、威胁情报、态势感知、代码审计工具这些。算法岗的笔试自然带着很强的安全业务色彩。对比一下就能看出来互联网大厂的算法卷子往往重模型、重框架、重业务场景给一堆特征让你设计模型奇安信这类安全公司的卷子则更看重底层原理、数据结构和处理边界的能力。原因其实不复杂。安全场景里算法跑在很严苛的环境下一台终端上既要实时扫描文件又不能占用太多CPU和内存很多模型推理必须在几十毫秒内完成还得解释得清楚为什么判恶意、为什么判误报。这就决定了笔试命题会重点考察候选人能不能写出高效、稳定、可解释的算法而不是只会调库调参。另外安全公司特别爱考字符串处理类算法。恶意软件特征匹配、URL检测、Web攻击载荷识别本质都是字符串匹配、模式匹配问题。这就是为什么KMP会出现在这份试卷里而且给了具体的模式串要求手算next数组。1.2 从热搜词反推考点的覆盖范围我把这套试卷相关的高频搜索词整理了一遍能很直观地看出考点分布集中在五大块模块代表考点为什么考数据结构与基础算法KMP的next数组、排序算法、堆排序、快速幂、Dijkstra、二分图HK算法算法基本功考察代码实现和复杂度分析能力经典策略算法贪心、剪枝、DP、回溯考察问题建模和优化能力机器学习与深度学习聚类、强化学习、音频重采样、图像拉普拉斯锐化考察AI基础与安全检测场景结合智能优化算法粒子群、模拟退火考察全局寻优能力常用于安全参数调优、对抗样本安全特色算法路径遍历、弱哈希算法CVE-2005-4900、BM25、Rete规则匹配直接关联安全产品底层逻辑这套结构其实暗示了一个信息奇安信算法岗要的不是只会机器学习的人而是计算机基础扎实、同时具备安全敏感度的人。后面每个模块我都展开说说。2. 数据结构与基础算法KMP的next数组这样手算才不容易错2.1 一个模式串引发的连锁反应热搜词里有一条很典型“在KMP算法中对于模式串pabacaba其next数组next[i]定义为...”。看到这个模式串我基本能确定这道题考察的是next数组的两种常见定义之间的区别。next数组在不同教材里有两种主流定义定义Anext[i]表示模式串中前i个字符组成的子串的最长相等真前后缀长度。定义Bnext[i]表示当模式串第i位失配时下一次跳转到模式串的第几位也就是在定义A的基础上整体右移一位next[0] -1。先说定义A。模式串p abacaba长度为7。前i个字符的最长相等真前后缀长度如下表i子串前i个字符最长相等真前后缀长度1a无真前后缀为空02ab无03abaa14abac无05abacaa16abacabab27abacabaaba3所以定义A下的next数组是[0, 0, 1, 0, 1, 2, 3]。如果是定义B也就是代码实现里最常用的写法next[i]表示失配跳转位置需要整体右移一位且next[0] -1于是变成[-1, 0, 0, 1, 0, 1, 2]。这两种写法我都计算过最容易混的就是这里。手算时先确认试卷给出的next[i]具体是怎么定义的是“最长相等前后缀长度”还是“失配跳转位置”。我当年做题的时候就吃过这个亏定义没看清按跳转位置写了结果一对答案发现试卷要的是定义A白丢好几分。如果要用代码实现失配跳转版本核心逻辑是两层循环// 计算失配跳转next数组next[0] -1 vectorint getNext(const string p) { int m p.size(); vectorint next(m); next[0] -1; int j 0, k -1; while (j m - 1) { if (k -1 || p[j] p[k]) { j; k; next[j] k; } else { k next[k]; } } return next; }这个写法里有个经典优化如果p[j] p[next[j]]跳转之后仍然会失配做了也白做所以有的优化版会连续跳。笔试时建议用递推的方式手算别用代码跑毕竟现场不给编译器。2.2 排序算法盘考点从冒泡到堆排笔试偏爱哪几类排序算法在这么多场笔试里几乎从不缺席但每次考的侧重点不太一样。奇安信这套卷子里排序相关的热词出现了“数据结构排序算法”“冒泡排序算法c”“堆排序算法”这几个说明至少有2到3题涉及排序。我的判断是这类题目不会只让你背代码通常会从三个角度切入第一是稳定性与时间复杂度对比。比如问以下哪个排序算法是稳定的堆排序的时间复杂度是多少最坏情况下快排的时间复杂度是多少这些基础概念看起来简单但混淆点很多。堆排序和快排都是不稳定的归并排序是稳定的冒泡和插入排序也是稳定的。整理成表更方便记忆算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n²)O(n²)O(1)稳定插入排序O(n²)O(n²)O(1)稳定快速排序O(n log n)O(n²)O(log n)不稳定堆排序O(n log n)O(n log n)O(1)不稳定归并排序O(n log n)O(n log n)O(n)稳定第二是堆排序的手写和过程模拟。比如给定一个数组要求建堆并输出堆排序结果。这类题在试卷里出现频率很高因为堆结构本身就适合处理Top K问题而Top K在安全日志分析里非常常见——海量告警里找出最需要关注的Top 10典型的堆应用。第三是快速排序的优化。比如问你如何避免快排退化到O(n²)答案就是随机选基准或者三数取中。这里我想多说一句快排的退化在安全场景里不是小事。如果攻击者知道你用的排序算法是固定基准的快排他可以构造特殊输入让排序过程退化成O(n²)拖垮整个系统。这就是算法复杂度的安全意义。很多安全公司笔试喜欢扣这个点不是没道理的。2.3 快速幂、Dijkstra、二分图匹配为什么这几类基础题必刷快速幂这个考点在热搜词里出现了好几次。快速幂的核心思想是把指数二进制分解用乘法次数从O(b)降到O(log b)。经典实现如下def quick_pow(a, b, mod): res 1 a % mod while b 0: if b 1: res res * a % mod a a * a % mod b 1 return res在安全算法岗的笔试里快速幂最大的应用场景是RSA相关的计算。RSA解密用到的模幂运算底数指数都很大不可能老老实实乘b次必须用快速幂把复杂度降到对数级别。奇安信做的是网络安全密码学相关内容当然会涉及所以快速幂考到一点都不意外。Dijkstra算法在热词里也出现了。常规的Dijkstra用优先队列优化是必会内容import heapq def dijkstra(graph, start): n len(graph) dist [float(inf)] * n dist[start] 0 pq [(0, start)] while pq: d, u heapq.heappop(pq) if d dist[u]: continue for v, w in graph[u]: nd d w if nd dist[v]: dist[v] nd heapq.heappush(pq, (nd, v)) return dist安全领域的图算法应用范围其实很广。比如威胁建模时把主机、进程、文件抽象成节点把调用关系抽象成边找攻击路径就是在图上做最短路径搜索。所以Dijkstra不只是应付笔试它真的是安全分析工具里的常客。二分图HK算法Hopcroft-Karp算法出现在热词里有点冷门但仔细一想也合理。HK算法是求二分图最大匹配的优化算法复杂度比匈牙利算法低一个量级。它把多个增广路径一起找一次BFS分层、一次DFS增广循环处理。笔试里如果要考大概率是选择题或者让你简述思路不太可能现场手撕完整实现因为代码量太长了。但核心思想要能说出来先BFS构建交替层级图再DFS找最短增广路径集多次迭代直到没有增广路径为止。3. 机器学习与深度学习算法试卷里那些“非典型”算法题怎么答3.1 聚类算法不只是K-Means热词里出现了“聚类算法”“机器学习算法”“深度学习算法”这些词。安全公司的算法岗笔试在机器学习部分通常不会考那种“默写softmax公式”的题而是更偏向聚类、异常检测这类无监督方法。为什么无监督方法在安全场景里更常用核心原因是标签太稀缺了。恶意软件样本的标注需要分析师一个一个看成本极高网络流量里的攻击样本更是大海捞针。有监督模型训练数据不平衡问题严重所以异常检测、聚类这类不需要大量标注的方法在安全产品中落地更早。K-Means是最基础的一类考法通常是给定几个点手动执行一轮K-Means迭代。流程是初始化质心、分配样本到最近质心、重新计算质心、重复直到收敛。这里有个容易踩的坑K-Means的目标函数是欧氏距离平方和如果特征量纲不统一聚类结果会严重偏向量纲大的特征。所以在真实项目中第一步一定是标准化或者Min-Max归一化笔试里如果给样本特征也要先扫一眼量纲。除了K-MeansDBSCAN这类基于密度的聚类算法也值得关注。DBSCAN不需要指定聚类数K能发现任意形状的簇还能自动识别噪声点。在安全场景里噪声点往往比簇本身更有价值——它们可能是新型攻击样本或者未知威胁这正是安全分析师最关心的。3.2 强化学习和深度学习基础考什么热词里“强化学习算法”“kl elbo 算法原理详解“”pid算法在crps psu power的作用”这几条说明试卷里还有强化学习的影子。我推测不会考大段的强化学习推导更可能是一道概念题比如什么是MDP五元组、什么是奖励折扣因子、策略迭代和值迭代的区别。这里我建议复习的时候重点掌握一个思维强化学习的本质是通过与环境交互获取奖励信号来优化策略而不是依赖标注数据。这个思想在安全里的应用场景是自适应防御策略——比如当一个攻击者正在横移时防御系统会根据当前检测到的行为动态调整策略决定是隔离主机还是诱导攻击者进入蜜罐。这就是一个典型的序贯决策问题。KL散度和ELBO这两个词出现在热词里大概率是变分推断相关的选择题。KL散度的定义是KL(P||Q) Σ P(x) log(P(x) / Q(x))它衡量的是用一个分布Q去近似另一个分布P时损失的信息量。KL散度非负但不满足对称性所以不是一个距离度量。ELBO证据下界是变分推断的核心概念把对数边际似然分解成ELBO加KL散度。备考时记住这两个概念之间的关系就够了最大化ELBO等价于最小化变分后验与真实后验的KL散度。3.3 BM25、规则引擎与Rete算法检索和推理背后的算法思维BM25算法在热词里出现我猜测要么是搜索引擎相关的题目要么是威胁情报检索相关的场景。BM25是一种基于词频和逆文档频率的排序函数用来估算文档与查询的相关性。它的核心公式是score(D, Q) Σ IDF(qi) * (f(qi, D) * (k1 1)) / (f(qi, D) k1 * (1 - b b * |D| / avgdl))其中f(qi, D)是词qi在文档D中的词频|D|是文档长度avgdl是平均文档长度k1和b是调节参数一般取k11.2~2.0b0.75。BM25和TF-IDF最大的区别在于BM25对词频做了非线性归一化同时引入了文档长度归一化避免长文档天然占便宜。在安全产品里BM25可以用在威胁情报匹配、告警相似度检索这些场景。比如一个企业收到大量告警分析师想找“和这条告警最相似的历史处置记录”就可以用BM25对告警文本做打分排序。Rete算法出现在热词里也很值得说。Rete是规则引擎Drools里使用的模式匹配算法。它的思想是把规则的条件部分构造成一个网络利用时间冗余和结构相似性避免每次事实变化时重新匹配所有规则。举个例子假设有规则当某个IP在短时间内扫描了多个端口、并且触发了同一个漏洞利用特征时判定为扫描攻击。Rete算法会把“IP扫描端口数 阈值”和“命中漏洞特征库”这两个条件分别存储当新的事实到来时只更新受影响的部分而不必把整个规则集重新跑一遍。这种增量匹配机制在安全检测引擎里非常实用因为告警事实是源源不断到来的每次全量匹配性能完全跟不上。奇安信的检测产品里如果接入了规则引擎Rete肯定有实际落地。4. 粒子群、模拟退火这类智能优化算法为什么进了安全公司的笔试题4.1 粒子群算法原理从鸟群觅食到参数寻优粒子群算法PSO出现在热词里可能是很多人没预料到的。如果你看到“粒子群算法原理”就觉得奇怪我解释一下你就明白了在安全领域很多问题最终都归结为在高维空间里找一个最优组合比如安全策略参数调优、恶意代码特征选择、AI模型的超参数搜索。粒子群的核心思想是模拟鸟群觅食。每个粒子代表解空间里的一个候选解粒子有位置和速度两个属性。每一轮迭代中粒子根据个体历史最优位置pbest和群体历史最优位置gbest来更新自己的速度再更新位置。速度更新公式v[i] w * v[i] c1 * rand() * (pbest[i] - x[i]) c2 * rand() * (gbest - x[i])位置更新公式x[i] x[i] v[i]其中w是惯性权重控制粒子的飞行惯性c1是个体学习因子c2是社会学习因子。w越大粒子越倾向于全局搜索w越小越倾向于局部精细搜索。常见做法是让w从0.9线性递减到0.4前期快速锁定区域后期精细搜索。我在实际项目里用PSO调过安全检测模型的阈值参数。比如检测模型输出一个0到1的分数分数超过阈值就判定为恶意。阈值定太高会漏报定太低会误报满天飞。用PSO在这个一维空间里搜索最佳阈值效率很高几轮迭代就能找到F1值最优的切分点。4.2 模拟退火从冶金退火到全局最优模拟退火算法SA的原理也是热词里的重点。这个算法的名字来自冶金学里的退火工艺金属加热到高温后缓慢冷却内部原子有足够时间重新排列最终形成能量最低的稳定晶体结构。模拟退火算法把这个过程抽象成最优化方法。算法的核心是Metropolis准则。当前解的能量为E1邻域产生一个新解能量为E2如果E2 E1则一定接受新解如果E2 E1则以概率exp(-(E2-E1)/T)接受新解。这里的T是当前温度温度越高接受差解的概率越大越容易跳出局部最优随着温度下降接受差解的概率越来越小算法逐渐收敛。模拟退火和贪心算法最大的区别就是它以一定概率接受劣解。贪心算法只会往好的方向走容易被困在局部最优模拟退火在高温阶段允许“走弯路”换取更大的探索空间。在安全里攻击路径规划、安全资源调度这些组合优化问题用模拟退火的局部搜索效果往往优于贪心。4.3 这些优化算法在安全产品里的真实用途我在准备这份试卷时查了很多资料发现智能优化算法在安全产品里的落地场景比想象中要广。举几个例子一是特征选择。安全模型往往有几百上千个特征特征之间还有相关性用穷举法找最优特征子集复杂度是2的n次方完全不可行。粒子群和模拟退火可以把特征选择问题转化成组合优化问题在可接受时间内找到近似最优解。二是对抗样本生成。现在AI安全里有个核心课题如何生成对抗样本绕过恶意检测模型。生成对抗样本本身就是一个优化问题——在保持语义不变的前提下让模型输出翻转攻击者常用的方法有FGSM、PGD这类梯度方法但粒子群这类进化算法在生成黑盒对抗样本时也有效因为不需要模型梯度。三是安全运营中的资源调度。比如一个SOC平台每天要处理上万条告警分析资源有限怎么安排这些告警的分析顺序让高风险的告警能最快被处理这也是一个优化问题可以用模拟退火或者PSO来做优先级排序。所以当你在笔试里看到粒子群、模拟退火时不要以为这是凑数题。它是真的会在安全业务里用到的算法命题人就是在考察你懂不懂这类工具的适用场景。5. 网络安全视角下的算法思维路径遍历、弱哈希与代码审计5.1 路径遍历一道经典漏洞题的算法本质热词里出现了“奇安信 输入验证路径遍历”这应该是与Web安全相关的题目。路径遍历Path Traversal的核心原理是Web应用在拼接文件路径时没有对用户输入做充分过滤导致攻击者可以通过../序列跳出预期目录读取服务器上的任意文件。从算法角度看路径遍历的本质是字符串归一化问题。服务器在处理路径时需要做两步操作先把用户输入和基础路径拼接再做路径标准化。如果拼接之后再做标准化攻击者就有机可乘了。比如基础路径是/var/www/html/拼接上../../etc/passwd标准化之后就变成了/etc/passwd。笔试里如果考到路径遍历我猜不是让你写渗透脚本而是让你设计一个检测函数输入一个文件路径字符串判断是否包含路径遍历攻击特征。检测思路有几个层次最基础的检测是否包含../或..\。进阶一点URL解码之后再做检测因为..%2f解码后就是../。再进阶多重编码检测%252e%252e%252f解两次码才是../。这就是为什么“输入验证”这四个字是题目里的重点。安全检测算法要考虑所有可能的编码方式而不是做一次字符串匹配就完事。类似的检测逻辑在WAF、API网关、代码审计工具里都在用是一个很典型的安全算法思维。5.2 弱哈希算法修复CVE-2005-4900的启示热词里有一条“SSL证书使用了弱hash算法CVE-2005-4900怎么修复”这明显是安全算法题的基础信息。CVE-2005-4900大概的意思是一些证书签名算法使用了MD5或SHA-1这类弱哈希攻击者可以构造哈希碰撞来伪造证书。哈希算法在安全里的用途很广数字签名、完整性校验、口令存储、文件指纹。MD5曾经是主流但早就被证明存在碰撞攻击2004年的王小云团队就实现了MD5碰撞。SHA-1也在2017年被Google成功碰撞。这就是为什么现代安全标准普遍要求用SHA-256或更强的哈希算法。笔试里如果考到弱哈希我建议从三个层面回答问题本质弱哈希算法存在碰撞可能性攻击者可以伪造同哈希值的不同内容。影响范围涉及证书签名、软件更新包校验、口令存储等场景。修复方案将算法替换为SHA-256及以上强度的摘要算法对旧证书做重签发在服务端配置中禁用弱加密套件。这个考点其实考察的是候选人对“密码学算法强度”有没有基本认知。作为安全公司的算法工程师你会经常和这些东西打交道不了解底层哈希算法的强度差异在实际做产品时一定会踩坑。5.3 奇安信这类公司笔试中最容易被忽略的“算法素养”除了一道道具体的算法题之外我发现奇安信这类安全公司的笔试还特别看重一种东西——对算法复杂度的敏感度。同样是实现一个功能你写出来的代码是O(n²)还是O(n log n)在安全场景里可能有天壤之别。安全检测引擎往往要应对海量流量和文件如果没有复杂度意识代码上线后大概率会拖垮性能然后被运维同事投诉。另外边界条件处理也是安全公司笔试的高频考察点。比如字符串匹配时要不要考虑空字符串、路径处理时要不要考虑Windows和Linux的路径分隔符差异、哈希计算时输入为空怎么办。安全领域有一个共识攻击者专门找你没考虑到的边界条件下手所以“看起来不会发生”的输入一定要处理。我在面算法岗时被反复教育的一句话是写代码先想清楚输入空间有多大、有没有可能被攻击者控制、会不会在极端情况下崩溃。这个习惯笔试时看不出来但面试官会通过追问的方式考察。如果你在笔试代码里主动做了边界处理印象分会好很多。6. 备考时间线与实战建议从这份试卷反推复习优先级6.1 如果让我重新准备我会按什么顺序刷题复盘完这套卷子的考点分布我的复习优先级建议是这样的第一阶段2周先把基础数据结构打牢。数组、链表、栈、队列、哈希表、树、堆这些基础结构要能随手写出代码。排序算法里重点练快排、堆排、归并配合复杂度分析。第二阶段1周字符串处理和模式匹配。KMP的next数组手算前后缀不只是背代码还有Trie树、AC自动机这类进阶字符串数据结构安全场景里经常用。第三阶段1周图论和基础优化算法。Dijkstra、二分图匹配、拓扑排序、最小生成树。重点练“用图建模”的能力——拿到一个实际问题能不能抽象成图。第四阶段1周机器学习和深度学习基础概念。聚类算法、强化学习框架、KL散度这些基础概念要能说清楚不需要推导复杂的公式但要知道是什么、为什么用、结合安全场景怎么用。第五阶段3天智能优化算法和密码学基础。粒子群、模拟退火、遗传算法的原理和适用场景MD5、SHA-1、SHA-256的算法强度差异随机数生成器的安全性。这个顺序的逻辑是数据结构是地基地基不稳后面都白搭字符串处理是安全公司的特色考点多加权重图论是很多安全分析工具的底层模型机器学习部分不需要面面俱到但核心概念要能讲明白优化算法和密码学是加分项用来体现你懂安全业务。6.2 笔试中的常见失误与应对策略我见过太多人在笔试里翻车翻车方式高度雷同这里整理几个高频失误点第一是手算next数组时定义混淆。前面说过next数组有两种定义笔试现场精神一紧张很容易手滑写错。应对策略是拿到题先看清楚“next[i]定义为……”这句话后面的内容再动笔。第二是排序算法比较时漏掉“稳定性”这个维度。很多人能背下来时间复杂度但问插入排序和快排哪个稳定会犹豫半天。建议把稳定性也做成表格强制记忆考前扫一遍。第三是复杂度分析不严谨。比如堆排序的空间复杂度很多人以为O(1)但实际上如果实现不当递归建堆或者额外建了数组空间复杂度可能就变成O(n)。笔试写答案时一定要区分清楚是理论最优O(1)还是你的实现版本的复杂度。第四是代码实现里没有处理边界条件。比如字符串匹配模式串为空、数组长度为0或1、Dijkstra里图没有连通这些情况。加了边界处理可能不会加分但不加一定会扣分。第五是时间分配不合理卡在难题上太久。我的经验是一份试卷里如果有选择题、简答题、代码题先把所有题快速扫一遍标记出会做的和不会做的先做会做的把自己确定能拿的分拿满再回头啃难题。这本身就是一种贪心策略只是很多人做不到。6.3 考完回头看这套卷子的刷题价值在哪里我个人的感受是奇安信这套卷子虽然在难度上不算天花板但覆盖面很全对准备安全算法方向的人来说是个很好的自查清单。如果你能不看答案把上面说的所有知识点都讲清楚、写出来那你的准备就已经相当扎实了。如果只抓一个重点我的建议是回到基本功上。安全厂商的算法笔试不像大厂那样追热点它是真的在考你计算机基础。KMP会不会手算、排序复杂度能不能说清、对安全漏洞原理有没有基本认知——这些才是他们真正关心的。最后分享一个我在备考中反复受用的小习惯每复习完一个算法先在小本子上用一两句话写下它的核心思想、时间复杂度、空间复杂度、典型应用场景然后合上本子闭上眼睛默述一遍。讲不清楚的地方就是还没真正掌握的地方。这个方法帮我快速定位知识盲区比盲目刷题高效得多。