Skip to content

算法与数据结构课程学习笔记

这组笔记按 课件 的讲次组织,并把 作业 中的书面题和 LeetCode 题定位到对应知识点。希望把每讲的定义、算法模板、复杂度、证明思路和易错点整理成可复习、可查表、可串联的知识图谱。

文件导航

讲次学习笔记对应课件
第 1 讲01-导论_基本数据结构_复杂度.md01Introduction.pdf
第 2 讲02-递归_分治_树_堆.md02lecture.pdf
第 3 讲03-排序算法与比较下界.md03lecture.pdf
第 4 讲04-选择问题_搜索树_红黑树_跳表.md04lecture.pdf
第 5 讲05-哈希表.md05 哈希表.pdf
第 6 讲06-动态规划.md06 动态规划.pdf
第 7 讲07-贪心算法.md07 贪心算法.pdf
第 8 讲08-图基础_最小生成树_BFS.md08 图算法.pdf
第 9 讲09-DFS_边分类_拓扑排序.md09 DFS.pdf
第 10 讲10-单源最短路径.md10 Shortest Path.pdf
第 11 讲11-全源最短路径.md11 all-pairs Shortest Path.pdf

全局知识图谱

图表渲染中…

作业定位图

作业材料题目主要知识点对应笔记
作业9.25/20.pngLeetCode 20 Valid Parentheses栈、括号匹配、不变量第 1 讲
作业9.25/150.pngLeetCode 150 Evaluate RPN后缀表达式、栈求值第 1 讲
作业9.25/232.pngLeetCode 232 Implement Queue using Stacks栈实现队列、摊还分析第 1 讲
书面作业1/hw1.py二叉树构造、插入排序、合并有序数组、逆序对树遍历、排序、分治计数第 2/3 讲
作业10.16/144.pngLeetCode 144 Binary Tree Preorder Traversal树遍历、递归/迭代第 2 讲
作业10.16/215.pngLeetCode 215 Kth Largest Element堆、快速选择、顺序统计量第 2/4 讲
作业10.16/493.pngLeetCode 493 Reverse Pairs归并排序、跨区间计数第 3 讲
书面作业2/assignment2.pdf Q1最长连续子序列期望线性算法哈希集合第 5 讲
书面作业2/assignment2.pdf Q2已排序频率下 O(n) Huffman双队列、贪心第 7 讲
书面作业2/assignment2.pdf Q3编辑距离动态规划第 6 讲
书面作业2/assignment2.pdf Q4用栈消除 DFS 递归DFS、显式栈第 9 讲
书面作业2/assignment2.pdf Q5最大瓶颈路径Dijkstra 变形、松弛第 10 讲
作业11.27/11.pngLeetCode 11 Container With Most Water双指针、贪心证明第 7 讲
作业11.27/72.pngLeetCode 72 Edit Distance字符串 DP第 6 讲
作业11.27/279.pngLeetCode 279 Perfect Squares完全背包/BFS第 6/8 讲
作业11.27/最后一题.pngLeetCode 1584 Min Cost to Connect Points完全图 MST、Kruskal/Prim第 8 讲

复习路线

  1. 先读第 1 讲,建立课程语言:数据结构、算法、程序、复杂度、栈队列和插入排序。
  2. 第 2 讲把递归、分治、递推分析、树、堆串起来,这是后面排序、选择、图搜索的共同基础。
  3. 第 3 和第 4 讲集中复习排序、选择和动态集合,重点能写出快排/快速选择/堆操作/BST 操作的伪代码,并能解释复杂度。
  4. 第 5 讲解决“期望 O(1) 查询”的核心:哈希函数、冲突、装载因子、全域哈希。
  5. 第 6 和第 7 讲对比两类设计范式:动态规划强调“记住子问题”,贪心强调“证明局部选择可被某个最优解接受”。
  6. 第 8 和第 9 讲进入图搜索与结构性质:MST、BFS、DFS、边分类、拓扑排序。
  7. 第 10 和第 11 讲复习加权图上的最短路:先掌握松弛,再区分 Bellman-Ford、Dijkstra、Floyd-Warshall、Johnson 的适用条件。

复杂度速查

问题/结构典型算法时间复杂度关键条件
栈/队列基本操作数组或链表实现O(1)队列数组实现常用循环队列
插入排序逐个插入已排序前缀最坏 O(n2)小规模或近乎有序时好用
归并排序分治合并O(nlogn)稳定,需额外空间
堆排序BuildHeap + ExtractMaxO(nlogn)原地,不稳定
快速排序Partition + 递归期望 O(nlogn)随机化避免固定坏例
计数排序按键值计数O(n+k)键值范围 k 不大
快速选择随机 Partition期望 O(n)最坏 O(n2)
中位数的中位数分组选择 pivot最坏 O(n)常数较大,理论重要
BST 操作Search/Insert/DeleteO(h)h 为树高
红黑树操作旋转 + 着色O(logn)保持近似平衡
哈希表链地址法Search/Insert/Delete期望 O(1+α)α=n/m
LCS二维 DPO(mn)可从表回溯最优解
0-1 背包二维/一维 DPO(nW)伪多项式,依赖容量
Huffman优先队列O(nlogn)已排序频率可双队列 O(n)
Prim优先队列O(ElogV)适合稠密图时也可 O(V2)
Kruskal排序 + 并查集O(ElogV)按边权从小到大选边
BFS/DFS邻接表O(V+E)图搜索线性时间
Bellman-Ford多轮松弛O(VE)可处理负边并检测负环
Dijkstra最小优先队列O(ElogV)边权非负
Floyd-Warshall三重循环 DPO(V3)适合稠密图/全源最短路
JohnsonBF 重赋权 + DijkstraO(VElogV)稀疏图全源最短路

考前检查清单

  • 能区分数据结构、算法和程序,并能解释为什么课程关注正确性、终止性和性能。
  • 能用循环不变量证明插入排序、归并排序、BFS、Dijkstra 等算法的正确性。
  • 能写出 OΩΘ 的形式化含义,并能比较常见增长率。
  • 能根据递推式画递归树,并套用主定理。
  • 能手写栈、队列、链表、堆、BST 的核心操作。
  • 能解释归并排序、堆排序、快速排序的时间复杂度和适用场景。
  • 能证明比较排序下界为 Ω(nlogn)
  • 能说明哈希表期望常数时间依赖简单均匀散列或全域哈希假设。
  • 能把 DP 题拆成状态、转移、边界、遍历顺序、答案和路径恢复。
  • 能为贪心算法写出贪心选择性质和最优子结构证明。
  • 能说明 MST 的 cut property,并据此证明 Prim 和 Kruskal。
  • 能解释 BFS 的层次性质、DFS 的时间戳和边分类。
  • 能根据边权条件选择 Bellman-Ford、Dijkstra、DAG shortest path、Floyd-Warshall 或 Johnson。