1. 初识INT102这门算法课到底在训练什么1.1 课程定位算法笔记不是代码抄写本拿到INT102 算法笔记这个题目很多人的第一反应是这又是一门教写代码的课。实际上INT102这门课的核心训练点从来不是把某个算法背下来然后默写出来而是让你建立一套从问题到解法的思维链路。你去搜算法是什么意思回答都是解决问题的步骤和方法但这个说法太轻飘飘了。真正上过算法课的人会明白算法的本质是在约束条件下做资源调度——时间、空间、精度、稳定性每一项都是成本算法就是在这些成本之间找平衡点。我在学习INT102的过程中有个很深的体会这门课的笔记不像文科那样抄板书就行。它更像是你在跟自己对话——记录我为什么一开始用暴力解法后来为什么换成二分这个状态转移方程我推了两遍才推对。这种带有思考痕迹的笔记才是算法笔记的真正价值。单纯记录代码片段期末复习时你只会看到一堆陌生的if-else完全想不起当时的思路。1.2 从热搜词看大家学算法的共性痛点我大致扫了一圈近期和算法相关的热搜词发现一个很有意思的现象搜索量靠前的并不是某个高深的前沿算法而是冒泡排序算法c数据结构与算法算法流程图二分查找算法这些最基础的名词。这说明大多数人的算法学习其实卡在起步阶段而不是卡在进阶阶段。另一个值得注意的点是搜曝京东算法全员将进行30%普调涨薪的人很多。这说明大家学算法除了兴趣还有一个很现实的需求——算法岗位的薪资天花板确实高。但我要提醒一句薪资高不代表门槛低。热搜词里的yolo算法讲解ppt3dgs算法最经典的论文这类内容说明视觉算法、深度学习算法已经是主流方向而这些方向对基础算法的要求不但没有降低反而更高了。你如果连二分查找的边界都搞不清楚去看3DGS的论文只会被里面的数学推导劝退。1.3 给不同基础读者的学习路线建议如果你是零基础我的建议是老老实实从INT102这类课程的大纲走先搞定复杂度分析再学数组、链表、栈、队列、树、图这些数据结构然后学排序和检索接着是贪心、分治、动态规划最后是图论算法。这套路线虽然传统但是经过几十年验证的不会错。如果你已经有基础想快速上手实际项目那你可以跳着学先看二分算法、贪心算法、剪枝算法这几个实用性强的然后直接进机器学习和计算机视觉方向。但有个前提——你得确保自己补基础的速度足够快否则后面越学越虚。2. 排序与检索多数人的算法功底卡在基本功不扎实2.1 排序算法从冒泡、归并到堆排序的选型逻辑排序是INT102课程里最基础但也最容易被轻视的模块。很多人觉得排序有什么好学的调个sort()不就完了。但如果你真正理解了排序你就理解了复杂度、稳定性、原地算法、分治思想、堆结构这些核心概念。先说说最常见的冒泡排序。它在面试里经常被拿来当最基础的考题但很少有人认真想过它的性能瓶颈。冒泡排序的时间复杂度是O(n²)如果你只是拿它来理解比较-交换的基本逻辑那没问题。但实际项目中我几乎不会用冒泡除非数据量极小比如十几个元素而且对代码简洁性要求极高。真正值得深入理解的是归并排序和堆排序。归并排序的分治思想贯穿了后面几乎所有高级算法你学归并排序时一定要搞懂合并两个有序数组这一步——这不是为了排序本身而是为了理解divide-and-conquer的递归结构。堆排序则牵扯出堆这个数据结构它的应用场景远不止排序优先队列、TopK问题、定时任务调度都用它。我个人的建议是时间有限的话排序这块把归并排序和快速排序彻底吃透堆排序理解原理、能手写堆的插入和删除就行冒泡和选择排序了解原理和复杂度特点即可。实际工程项目里稳稳用标准库的排序函数不要自己造轮子。2.2 二分与二分查找边界条件里的魔鬼细节二分查找是INT102课程里性价比最高的算法没有之一。它的思路人人都能复述——每次把搜索范围缩小一半。但真正的魔鬼在边界条件里。我见过太多人在面试时折在二分上不是因为不懂思路而是因为判断条件是left right还是left right、更新边界时mid要不要加一减一这些细节一错就死循环或者漏检。分享一个我屡试不爽的模板思路使用左闭右闭区间也就是[left, right]。初始left 0right n - 1。循环条件是while (left right)中间值mid left (right - left) / 2。当nums[mid] target时直接返回当nums[mid] target时left mid 1当nums[mid] target时right mid - 1。这个模板配合寻找左边界寻找右边界两种变体练习基本能覆盖所有二分问题。热搜词里的二分算法二分查找算法除了二分法还有什么算法说明很多人知道二分重要但不清楚它的边界条件。实际上二分查找的核心价值不在于找值而在于在一段单调的区间里寻找满足某个条件的分界点。理解到这一层你就能用它解决很多看似无关的问题——比如在有序数组里找第一个大于等于target的位置求平方根这些本质上都是二分。2.3 KMP与字符串匹配从暴力到优化的思维跃迁如果排序和二分让你感受到基础算法的威力那KMP算法则是INT102课程里第一个真正让你烧脑的算法。它的应用场景是字符串匹配——在一个长文本里查找某个模式串出现的位置。暴力的做法是双循环时间复杂度O(n*m)文本一长就直接卡死。KMP的核心改进在于当匹配失败时不是把模式串右移一位重新开始而是利用已经匹配的信息跳过那些必然不可能匹配的位置。KMP的难点在于next数组也叫部分匹配表的构建。我在学习时用了一个比较接地气的理解方式next[i]表示模式串前i个字符组成的子串中最长的相同前后缀的长度。举个具体的例子模式串ABABC它的next数组手算出来是[0, 0, 1, 2, 0]。为什么ABAB这个前缀的next值是2因为它的最长相同前后缀是AB。KMP匹配失败时把j回退到next[j-1]就避免了暴力算法里从头再来的浪费。学KMP那几天我花了不少时间后来我发现一个更高效的理解路径先手算几个模式串的next数组再用代码验证最后再用它去解LeetCode上的实现strStr()。这个三步法推荐给大家。KMP之后如果你想继续深挖字符串算法可以看祖冲之密码算法详解这类内容因为字符串匹配和密码学里的模式查找有共通之处。但注意入门阶段把KMP吃透就够了不要贪多。3. 贪心、分治与动态规划三步拆解经典算法思想3.1 贪心算法局部最优怎么敢说是全局最优INT102课程进入算法思想模块后第一个迎面而来的就是贪心算法。贪心的核心逻辑非常朴素每一步都选择当前看起来最优的方案期望最终结果是全局最优。问题是——凭什么局部最优就能导出全局最优这个凭什么才是贪心的灵魂。如果你证明不了局部最优和全局最优的一致性那你的贪心只是看起来合理的猜测随时可能翻车。教科书上最经典的例子是活动选择问题给出一堆会议的开始时间和结束时间怎么安排才能参加最多的会议正确的贪心策略是按结束时间排序每次选结束最早且不冲突的会议。为什么这个策略是对的因为结束时间越早给后面留下的时间就越多。这个证明逻辑你可以用反证法去推如果存在一个最优解它的第一个选择的会议不是结束时间最早的会议那把第一个选择换成结束时间最早的会议一定不会让结果更差。但猜一个策略然后祈祷它是对的是初学者最容易掉的坑。以跳跃游戏2 贪心算法为例很多人第一眼看到这个题觉得每次跳最远就是贪心。实际上这个题的贪心策略确实成立——每次在可跳范围内选下一次跳得最远的那个位置起跳。但如果你只是凭感觉写个i nums[i]的最大值不把当前可达范围和下一步可达范围分开管理代码很容易写错。算法设计与分析这门课对贪心的要求是你能证明每个贪心选择之后原问题变成了一个规模更小的同构子问题。简而言之贪心步骤必须满足无后效性——当前的选择不影响后续子问题的求解结构只改变子问题的输入规模。这个理解到位了你做题时就不会慌。3.2 分治与归并把大问题拆到可解分治的知名度很高但很多人的理解停留在递归层面。这里要厘清一个概念递归是一种编程技巧分治是一种问题求解策略。分治策略包含三个步骤分解、解决、合并。关键是这三步各自要做什么必须想清楚否则递归写起来就是一团乱麻。归并排序是分治思想的最佳教学案例把数组从中点分成两半分别排序最后把两个有序数组合并成一个。合并这一步技巧在于用两个指针分别遍历左右两个子数组谁小谁先进结果数组。时间复杂度O(n log n)的来源也在这里分的过程是log n层每层合并的总工作量是O(n)相乘就是O(n log n)。除了排序分治思想在求数组最大子数组和计算x的n次幂求解逆序对数量这些问题里也发挥着核心作用。以逆序对数量为例你可以在归并排序的合并过程中统计当右半部分的一个元素小于左半部分的某个元素时左半部分从该位置到末尾的所有元素都和这个右半部分元素构成逆序对。这个过程如果不用分治暴力解法需要O(n²)次比较用了归并排序的分治框架整个统计可以在O(n log n)内完成。我在INT102里学到的一个心得是分治算法的递归树其实就是问题复杂度的可视化。你把递归树画出来每一层的总工作量清楚了复杂度自然就出来了。遇到递归不知道怎么分析复杂度时画树永远是第一选择。3.3 动态规划与记忆化以空间换时间的典型思维动态规划是算法学习里的一座山也是INT102课程的重点。它的核心思想是把原问题拆分成相互重叠的子问题把子问题的解存起来避免重复计算。动态规划和分治的最大区别在于分治的子问题是不重叠的动态规划的子问题是重叠的。正因为子问题重叠缓存子问题的解才有意义。动态规划五步法是我在实际学习中总结出来的分享给大家明确dp[i]或者dp[i][j]的定义这一步错了后面全废确定递推关系也就是状态转移方程初始化dp数组的边界值确定遍历顺序是从左到右、从右到左还是两层循环各自什么方向用一个小例子手动推演一遍确保结果正确。举个INT102里最常见的例子——爬楼梯。定义dp[i]为爬到第i阶有多少种方法那么dp[i] dp[i-1] dp[i-2]初始化dp[0] 1不动也是一种方案dp[1] 1从i2开始遍历。这样写出来的动态规划空间复杂度O(n)如果你再进一步发现每次只依赖前两个状态可以用两个变量滚动更新把空间压缩到O(1)。很多人学动态规划会死记状态转移方程这是最要命的。我的建议是每遇到一个动态规划题先别急着写代码先自己手动推一个小规模的例子把dp表画出来感受状态是怎么一步步被填满的。这个动作做上二三十个题之后你会形成肌肉记忆见到最大最小方案数子序列这类关键词自然就知道该往动态规划方向想。4. 图论与启发式搜索从prim到匈牙利再到启发式算法家族4.1 图论基础算法prim、最短路径与网络流图论是INT102课程里内容最庞杂的模块。热搜词里的prim算法匈牙利算法都是这个方向的代表。先说prim算法——它的用途是最小生成树也就是在一个带权无向图里找一棵连接所有节点且总边权最小的树。它的思路和Dijkstra最短路径算法长得很像但两者有本质区别Dijkstra每次选距离起点最近的节点prim每次选距离当前生成树最近的节点。这个细节我当年学的时候搞混了好几次建议大家在笔记里专门列一个对比表格。最小生成树还有一个Kruskal算法它的思想是贪心并查集把所有边按权值从小到大排序依次尝试加入生成树如果加入这条边不会成环就保留它成环就跳过。并查集的路径压缩和按秩合并两个优化在Kruskal里是核心这两个优化本身也是高频考点。至于更复杂的网络流问题最大流、最小割INT102课程通常作为进阶内容带过。如果你以后想搞AI Infra或者推荐系统网络流值得认真学如果只是应付课程和基础面试理解概念即可不必深挖。4.2 匈牙利算法与二分图匹配匈牙利算法最近搜索量不小大概率是因为它在目标跟踪比如ByteTrack、BoT-SORT这类算法和多目标关联场景里频繁出现。匈牙利算法解决的是二分图最大匹配问题——从字面上看就是把二分图里能配对的节点尽量都配上对。匈牙利算法的核心是增广路径。它的步骤如下从左边的第1个节点开始尝试匹配右边节点如果右边节点未被匹配匹配成功如果右边节点已被匹配尝试让右边节点当前的匹配对象另寻他路如果能在右边节点的匹配对象那里找到新的可匹配节点就通过增广路径让两个匹配都成功如果找不到就说明当前节点无法匹配跳过。你光看步骤可能觉得抽象但画一个只有3到4个节点的二分图手动跑一遍立刻就能理解增广路径的意思从左边未匹配节点出发经过一条未匹配边-匹配边-未匹配边交替的路径最终到达右边未匹配节点把这条路径上的匹配状态翻转匹配数就加一。BoT-SORT跟踪算法C实现里为什么会用到匈牙利算法因为多目标跟踪的本质是帧间目标关联——上一帧的某个追踪框和这一帧的某个检测框它们对应于同一个物体需要做最优匹配。如果把上一帧的目标作为左节点、这一帧的检测框作为右节点关联代价作为边权那求最优匹配就变成最大权匹配问题。匈牙利算法在这里的应用是连接底层算法和工业实战的重要桥梁。4.3 启发式算法模拟退火、粒子群、蚁群、遗传当你遇到一个优化问题精确算法算不动的时候就该启发式算法上场了。INT102课程里通常会讲模拟退火、遗传算法这类基于种群的元启发式热搜词里的粒子群算法原理蚁群算法nsga-ii算法都属于这个大家族。它们的共同特征是不保证找到全局最优解但能在可接受的时间内找到足够好的近似解。模拟退火算法的灵感来自金属退火工艺——把金属加热后再缓慢冷却让原子结构趋向最低能量状态。算法核心有一个温度参数T在温度高的时候它允许算法接受一个更差的解以此跳出局部最优随着温度下降接受差解的概率逐渐降低最终收敛到一个较优解。接受概率通常用Metropolis准则计算如果新解比当前解好一定接受如果更差以exp(-(E_new - E_current) / T)的概率接受。如果你以后做物流路径规划、排产调度、芯片布线这类问题粒子群和蚁群算法会经常遇到。粒子群的思路是模拟鸟群觅食每个粒子代表一个解它有位置和速度每次迭代时根据个体历史最优位置和群体历史最优位置来更新自己。蚁群算法的灵感来自蚂蚁觅食的信息素路线——走过的路径上留信息素路径越短信息素越浓后续蚂蚁越容易选这条路形成一个正反馈。这类算法虽然数学证明不像精确算法那么严谨但工程实践中的效果往往出人意料地好。5. 算法与前沿领域机器学习、视觉、控制里的算法印记5.1 机器学习与深度学习中的基础算法学完INT102的基础算法你会发现机器学习和深度学习里的很多概念底层都是经典算法的延伸。比如K-Means聚类它就是贪心迭代思想的代表初始随机选K个中心点然后反复执行分配样本到最近中心和更新中心位置两步直到收敛。DBSCAN算法实例则体现了密度连通的思路和K-Means最大的区别在于它不需要事先指定类别数而且能识别噪声点。EM算法期望最大化算法是另一个例子。热搜词里em算法主要用在哪的答案有很多其中最典型的是高斯混合模型GMM的参数估计。EM算法的迭代过程非常像猜-验证-修正的循环E步根据当前参数猜测隐变量的期望也就是每个样本属于哪个高斯成分的概率M步根据这个猜测重新估计参数反复迭代直到参数稳定。这个过程和你做贪心、做迭代优化时的心态是一样的——不追求一步到位而是每步都往正确的方向挪一点。深度学习算法层面vue3 diff算法这种前端框架里的diff和3dgs算法最经典的论文这种图形学方向的内容看起来八竿子打不着但底层的最小化更新代价思想是相通的。你去看Vue3的diff算法源码会发现它在处理列表复用问题时也用到了类似最长递增子序列的动态规划思想。这就是算法有趣的地方——同一个数学内核在不同领域披着不同的外衣。5.2 计算机视觉中的经典算法与模型热搜词里计算机视觉:算法与应用第二版课本pdfsobel算法sgbm算法介绍android opencv 的 grabcut 算法yolo算法讲解pptmaxxvitv2-nano分类算法都在视觉这个方向。我想说的是很多视觉领域的经典算子本质上是信号处理和数值计算的组合。以Sobel算法为例它是最基础的边缘检测算子。原理是利用两个3×3的卷积核分别计算图像在水平方向和垂直方向上的梯度近似值。它的背后是图像的一阶导数的离散近似——导数大的地方灰度变化剧烈就是边缘。Sobel之所以经典是因为它把导数这个数学概念用一次卷积就实现了效率极高。你在OpenCV里调一行cv2.Sobel()背后就是这些基础的数值计算。再比如GrabCut它在OpenCV里做交互式前景抠图非常实用。它的原理是图割Graph Cut——把图像像素看成图的节点像素之间相似度看成边的权重然后通过最小割算法把前景和背景分开。你看这又是图论算法在视觉领域的应用。而YOLO系列则是深度学习目标检测的代表它把目标检测建模成一个回归问题直接在图像上预测边界框和类别概率。学YOLO之前你要先懂最大池化卷积核特征金字塔这些概念而这些概念从数学上讲仍然是矩阵运算和优化算法的组合。5.3 控制与信号处理PID、卡尔曼滤波算法不只是传统计算机科学领域的专属控制领域和信号处理领域也有大量算法。热搜词里的pid算法增量式pid算法卡尔曼滤波算法ntc温度传感器算法就是典型代表。PID算法的全称是比例-积分-微分控制。它做的事情很简单根据当前误差、历史误差累积和误差变化趋势计算一个控制输出。比例项负责现在积分项负责过去微分项负责未来。实际工程中增量式PID用得很多。它输出的不是控制量的绝对值而是控制量的增量好处是执行器不会产生大幅跳变。我自己调试过温度控制回路经验是先把积分项和微分项设为0只调比例项让系统振荡起来然后加大积分项消除稳态误差最后引入微分项抑制超调。这个调参顺序和算法课程里的分而治之思想如出一辙。卡尔曼滤波则是另一个让人又爱又怕的算法。它在有噪声的传感器数据里估计系统真实状态应用范围从无人机的姿态解算到自动驾驶的目标跟踪。卡尔曼滤波的核心是预测-更新循环预测步骤根据运动模型比如匀速运动假设外推当前状态更新步骤把传感器观测值和预测值按协方差加权融合。那个加权融合的系数就是卡尔曼增益K它决定了你更相信模型还是更相信传感器。你在搞机器人、自动驾驶、无人机的时候卡尔曼滤波几乎是躲不开的。6. 从课堂到面试一份算法能力自查清单6.1 算法学习中的常见误区与破解方式学了INT102一整门课之后我复盘了一下自己和周围同学踩过的坑整理出几个高频误区。第一个误区是只刷题不看原理。LeetCode刷了几百道但问到你为什么这题可以用二分二分查找的前提条件是什么答不上来。这种刷法应付笔试还勉强可以面试一轮深挖原理就露馅。破解方式每做完一道题在笔记里写一行这题考察的核心知识点是__为什么能用该算法不能用的场景是__。第二个误区是只学新算法不复习旧算法。人的记忆曲线是很诚实的今天学的KMP两周不碰基本忘光。破解方式用间隔重复的方式做旧题重刷不需要完整重写代码用手推算法流程或者只写核心函数即可。这个习惯花的时间不多但对记忆的巩固效果特别好。第三个误区是直接啃论文。热搜词里3dgs算法最经典的论文热度很高但我想提醒的是如果基础算法都没掌握直接看论文就是看天书。计算机视觉论文里随手就是SfM、多视图几何、优化求解器不把线性代数、概率论和基础算法补扎实论文只能看懂摘要和图片。破解方式按基础课程 → 经典模型论文 → 最新论文的顺序循序渐进。第四个误区是忽视手写代码能力。面试经常要求在白板上写代码如果你平时依赖IDE的自动补全写不出完整代码会很尴尬。破解方式每周至少手写2到3个经典算法不需要运行环境用纸笔或者在文本编辑器里裸写。6.2 面试刷题与实战应用如何平衡算法岗位招聘热度一直很高薪资也确实有吸引力这从曝京东算法全员将进行30%普调涨薪这个热搜就能看出来。但算法工程师和会算法的工程师是两个概念。面试时基础算法题排序、二分、动态规划、图论是敲门砖而真正决定offer等级的是你能不能把算法用在真实业务数据上。我的建议是刷题要有性价比意识。优先刷高频题型的模板题——二分查找模板、DFS/BFS模板、滑动窗口模板、动态规划常见题型背包、打家劫舍、子序列、图的最短路径Dijkstra模板。这些模板题刷熟之后再去做变体题你会发现大多数题都是在模板上加了一点变形。同时每学一个算法想办法在真实数据上跑一次。比如学了PID自己买一个温度传感器模块写一个闭环温控程序学了卡尔曼滤波找一组带噪声的GPS轨迹数据写代码滤波后再对比效果学了Sobel用OpenCV跑一下边缘检测感受不同阈值下检测结果的变化。这一步是从解题者升级为工程者的分水岭。另外时间管理上也说一句刷题贵在持续而不是突击式爆发。每天一小时比周末八小时效果好得多因为算法思维需要每天热着。6.3 我的个人实践经验与最后建议INT102这门课学完之后我最大的收获不是记住了多少算法而是建立了一个算法审美好——拿到一个问题的第一反应不是急着写代码而是先判断这个问题是计算问题、搜索问题、优化问题还是组合匹配问题候选算法有哪些各自的复杂度是多少这类问题在面试中是不是高频这种反应速度需要大量的刻意练习才能形成。最后分享一个特别实用的小技巧维护一份属于自己的算法模板库。每学一个算法把它整理成固定的模板代码加上注释说明边界条件和易错点。比如二分查找的左闭右闭模板、动态规划的五步法模板、KMP的next数组求法模板。面试前不需要把几百道题重刷一遍只需要把这些模板过一遍再把对应的经典题在脑子里推演一遍就足够了。算法学习的路很长但与高考数学一样它是一个投入产出比非常确定的方向——只要你花时间就一定会有回报。希望这份INT102算法笔记能帮你把这条路走得稍微轻松一点。
阅读完成 · 觉得有帮助?