文章目录
- 先了解整体:先了解课程内容,知道学习的都有哪些算法,能够解决什么问题
- 接着具体了解每个算法的推导与思想,并进行实践
一、课程核心算法体系
结合课程大纲的七章内容,核心算法可按“基础理论-经典算法-高级技术-复杂场景-问题分类-优化策略”的逻辑划分为六大模块,具体如下:
(一)基础支撑:算法分析与数据结构基础
本模块是所有算法学习的“前置工具”,不直接涉及具体算法设计,但决定了算法性能评估与实现的合理性:
- 算法复杂性分析:
- 时间复杂度(最坏/平均/最好情况)、
- 空间复杂度的计算方法,包括递推关系求解(考试重点)(如主定理、序列求和法)、
- 循环语句复杂度分析等,是后续评估所有算法性能的核心手段。
- 数据结构基础: 衔接预修课程《数据结构》,重点复习数组、链表、栈、队列、堆、哈希表、树(二叉树、平衡树)、图(邻接矩阵/邻接表)的存储与基本操作,这些结构是算法实现的“载体”(如堆用于有序子序列合并,图用于网络流算法)。
(二)经典排序与分治:算法设计入门
本模块以“分治思想”为核心,覆盖排序算法的全谱系,是理解“分而治之”策略的关键:
- 分治法核心算法:
- 基本原理:将问题划分为若干规模更小的子问题,递归求解子问题后合并结果(如苹果市场最大利润问题的分治解法)。
- 典型案例:归并排序(分治思想的经典实现,时间复杂度 O ( n lg n ) O(n\lg n) O(nlgn))、快速排序(分治+随机选择基准,平均 O ( n lg n ) O(n\lg n) O(nlgn))。
- 排序算法全维度覆盖:
- 比较排序:除分治类排序外,还包括插入排序、选择排序(基础 O ( n 2 ) O(n^2) O(n2)算法,用于理解排序本质),并重点讲解“比较排序性能下界”(即任何比较排序最坏时间复杂度不低于 O ( n lg n ) O(n\lg n) O(nlgn))。
- 线性时间排序:突破比较排序下界的算法,包括计数排序、基数排序(如作业中 [ 0 , n 2 − 1 ] [0,n^2-1] [0,n2−1]整数的 O ( n ) O(n) O(n)排序)、桶排序,核心是利用“元素取值范围”或“非比较操作”降低复杂度。
- 延伸应用:中位数与任意顺序数搜索(基于分治的选择算法,时间复杂度 O ( n ) O(n) O(n))。
(三)高级设计技术:解决复杂优化问题
本模块聚焦“动态规划”“贪心”“字符串匹配”三大技术,针对“重叠子问题”“最优子结构”等复杂场景:
- 动态规划(DP):
- 核心适用场景:问题具有“重叠子问题”(子问题重复计算)和“最优子结构”(全局最优解包含子问题最优解),如最长公共子序列(LCS)、最大子数组和、矩阵链乘法、背包问题(0-1背包、完全背包)。
- 设计步骤:定义状态→推导状态转移方程→初始化→计算最优解(重点是“避免重复计算”,通过备忘录或迭代填表实现)。
- 贪心算法:
- 核心适用场景:问题具有“贪心选择性质”(局部最优选择可导出全局最优),如霍夫曼编码(最优前缀码)、活动选择问题、最小生成树的Prim/Kruskal算法(后续图算法的基础)、单源最短路径的Dijkstra算法。
- 关键区别:与动态规划的对比——贪心“局部最优优先”,无后效性;动态规划“全局规划”,处理后效性。
- 字符串匹配:
- 基础算法:朴素匹配( O ( n m ) O(nm) O(nm)),用于理解匹配本质。
- 高效算法:KMP算法(利用“部分匹配表”避免回溯, O ( n + m ) O(n+m) O(n+m))、Boyer-Moore算法(实际应用中更高效,基于坏字符/好后缀规则)。
(四)图算法:复杂关系建模与求解
本模块是算法在“图结构”上的集中应用,覆盖图的基础操作与核心优化问题,课时占比最高(10学时),是课程重点:
- 图的基础操作:
- 图的表示:邻接矩阵(适合稠密图,查询 O ( 1 ) O(1) O(1))、邻接表(适合稀疏图,空间 O ( n + m ) O(n+m) O(n+m))。
- 图的周游:深度优先搜索(DFS,用于拓扑排序、连通分量检测)、广度优先搜索(BFS,用于最短路径(无权图)、层次遍历)。
- 图的核心优化问题:
- 最小生成树(MST):在无向连通图中找到权值和最小的生成树,算法包括Prim(基于贪心,适合稠密图, O ( n 2 ) O(n^2) O(n2)或 O ( m lg n ) O(m\lg n) O(mlgn))、Kruskal(基于并查集,适合稀疏图, O ( m lg m ) O(m\lg m) O(mlgm))。
- 单源最短路径:从一个起点到所有其他顶点的最短路径,包括Dijkstra(贪心,适合非负权图, O ( m lg n ) O(m\lg n) O(mlgn))、Bellman-Ford(处理负权边, O ( n m ) O(nm) O(nm))、SPFA(Bellman-Ford的优化,平均 O ( m ) O(m) O(m))。
- 网络流:解决“流量最大化”“费用最小化”问题,包括最大流(Ford-Fulkerson方法、Edmonds-Karp算法)、最小费用最大流(SPFA+EK算法),是图算法中的难点,需结合“残留网络”“增广路径”等概念理解。
(五)问题复杂度分类:NP完全问题
本模块从“算法可解性”角度,界定问题的复杂度类别,是理解“难问题”的关键:
- 基础概念:
- P类问题:存在多项式时间算法可解决的问题(如排序、最短路径)。
- NP类问题:非确定性多项式时间可验证的问题(即“给定解,可在多项式时间验证是否正确”,如旅行商问题的解验证)。
- NP完全问题(NPC):
- 核心性质:NPC问题是NP类中“最难”的问题——若任何一个NPC问题存在多项式时间算法,则所有NP问题都存在多项式时间算法(即P=NP)。
- 典型NPC问题:布尔可满足性问题(SAT,第一个被证明的NPC问题)、旅行商问题(TSP)、顶点覆盖问题、集合覆盖问题。
- 证明方法:通过“多项式时间归约”(将已知NPC问题归约到目标问题,证明目标问题至少与NPC问题一样难)。
(六)难问题的优化策略:近似与穷举
本模块针对NPC问题,提供“无法求最优解时的替代方案”:
- 近似算法:
- 核心思想:对NPC问题,设计多项式时间算法,保证解的“近似比”(即近似解与最优解的差距在可控范围内)。
- 典型案例:顶点覆盖问题的2-近似算法、旅行商问题(度量TSP)的2-近似算法(基于MST)。
- 穷举搜索优化:
- 回溯法:通过“剪枝”减少无效搜索(如N皇后问题、子集和问题),本质是“深度优先的穷举+可行性剪枝”。
- 分支限界法:通过“下界/上界”剪枝(如旅行商问题的分支限界解法),本质是“优先搜索更可能接近最优解的分支”,通常结合优先队列实现。
二、课程学习思路
结合课程的“理论+应用”属性,建议按“基础→进阶→实战”的三阶思路学习,兼顾算法原理与问题解决能力:
(一)一阶:夯实基础——理解“是什么”与“为什么”
- 算法原理吃透核心逻辑:
- 对每个算法,先明确“解决什么问题”(适用场景),再拆解“设计步骤”(如动态规划的“状态定义→转移方程”),最后推导“复杂度”(用课程第一章的分析方法验证,如主定理求解分治算法复杂度)。
- 举例:学习分治法时,先通过“归并排序”理解“划分-求解-合并”的三步流程,再用“苹果市场利润问题”练习如何将实际问题抽象为分治模型,最后计算时间复杂度 O ( n lg n ) O(n\lg n) O(nlgn)。
- 数据结构与算法强绑定:
- 不孤立记忆数据结构,而是结合算法理解其作用:如“堆”对应“优先队列”,用于“k个有序子序列合并”“Dijkstra算法”;“哈希表”对应“快速查询”,用于“两数异或为k”的 O ( n ) O(n) O(n)算法。
(二)二阶:进阶思考——对比“差异”与“关联”
- 同类算法对比:
- 排序算法:
- 比较“比较排序”与“线性排序”的适用场景(如数据范围小用计数排序,数据无序用快速排序);
- 对比“归并排序”与“快速排序”的稳定性、空间复杂度(归并稳定但需 O ( n ) O(n) O(n)空间,快速排序不稳定但空间 O ( lg n ) O(\lg n) O(lgn))。
- 动态规划与贪心: 对比“最优子结构”的差异(DP处理重叠子问题,贪心处理无后效性的局部最优),如“0-1背包”用DP(每个物品选/不选,有后效性),“分数背包”用贪心(可分割,局部最优即全局最优)。
- 排序算法:
- 跨模块算法关联:
- 图算法与贪心:Prim/Kruskal/Dijkstra均基于贪心思想,需理解“为何这些图问题满足贪心选择性质”。
- 分治法与NP完全:分治法能解决的问题多为P类(如排序),而NPC问题无法用分治法高效求解,需转向近似算法。
(三)三阶:实战落地——训练“抽象”与“实现”
- 问题抽象能力:
- 将实际问题转化为算法模型:如“苹果市场买卖”抽象为“找 i < j i<j i<j使 S [ j ] − B [ i ] S[j]-B[i] S[j]−B[i]最大”,进一步抽象为分治模型;“k个有序子序列合并”抽象为“优先队列维护当前最小元素”。
- 算法实现与优化:
- 手写代码验证:对经典算法(如归并排序、KMP、Dijkstra),用代码实现并测试边界案例(如空数组、图中有负权边)。
- 复杂度优化练习:如作业中“ O ( n ) O(n) O(n)排序”“ O ( n ) O(n) O(n)异或检查”,需思考“如何利用问题条件(如 a i < n 2 a_i<n^2 ai<n2)降低复杂度”,而非直接套用通用算法。
- 难点突破:
- 动态规划:多做“状态定义”练习(如从“最长公共子序列”到“编辑距离”,体会状态的扩展)。
- 图算法:画图理解“残留网络”“增广路径”,用小案例(如3个节点的网络流)手动模拟算法步骤。
1563

被折叠的 条评论
为什么被折叠?



