数据结构与算法底座
把问题组织成可计算的形状:复杂度、结构选择、遍历搜索、递推优化与工程性能入口
阅读定位: 这页是计算机专业里的“数据结构与算法”主线入口。它不替代刷题手册,也不替代某门语言的集合类速查;它负责把数组、链表、栈队列、树、图、哈希、排序、搜索、贪心、动态规划和复杂度分析接成一张可复用的判断地图。
边界原则: 本页解释“为什么选这种结构和方法”。具体语言实现、面试题细节、框架源码和生产性能证据,应继续回到 Java、系统底座、性能工程、数据库、缓存和分布式专题。
把问题建模成结构→
选择可控的操作代价→
证明结果正确并能扩展
| 层级 | 核心问题 | 典型能力 | 常见误读 |
| 结构层 | 数据之间是什么关系 | 线性、层级、网状、映射、优先级、区间 | 只按题型记“用什么模板” |
| 代价层 | 时间和空间怎样增长 | Big-O、摊还、最坏 / 平均、递归深度、内存局部性 | 只会说 O(n),不知道常数和真实机器也会改变表现 |
| 策略层 | 怎样从局部动作得到整体结果 | 遍历、分治、贪心、动态规划、回溯、剪枝、随机化 | 把算法当成魔法公式,而不是约束下的选择 |
| 证明层 | 为什么它一定对 | 循环不变量、归纳证明、交换论证、反例构造 | 只跑过样例,就以为算法正确 |
数组 / 动态数组
适合按下标访问、连续扫描和缓存友好场景。代价是中间插入删除昂贵,扩容需要搬迁。很多工程性能问题都先从数组局部性开始。
链表 / 指针结构
适合频繁局部插入删除和结构重连。代价是随机访问慢、缓存不友好、对象分配多。真实工程里常被数组或块状结构替代。
栈 / 队列 / 双端队列
适合处理“最近未完成”“先进先出”“滑动窗口”这类顺序约束。函数调用栈、BFS、单调队列都从这里长出来。
哈希表
适合把查找降到均摊 O(1)。真正难点在哈希函数、冲突、扩容、内存占用和顺序语义,不是“查得快”四个字。
树 / 堆 / Trie
适合层级、排序、优先级和前缀问题。二叉搜索树、堆、B+ 树、LSM Tree、Trie 分别连接内存结构、数据库和检索系统。
图
适合表达依赖、路径、连通、匹配和流。社交网络、包依赖、调度、路由、权限继承、知识图谱都可以回到图模型。
| 策略 | 一句话理解 | 典型问题 | 判断要点 |
| 排序与二分 | 先建立有序性,再用有序性换查询效率 | 排序、查找边界、区间判断、Top K | 是否能付出预处理成本,是否有单调性 |
| 双指针 / 滑动窗口 | 用两个边界维护一段可控区间 | 子数组、字符串窗口、去重、合并 | 窗口是否能单调移动,状态是否可增量维护 |
| BFS / DFS | 按层或按深度遍历状态空间 | 树图遍历、连通块、最短步数、拓扑排序 | 状态是否会重复,是否需要 visited 和路径恢复 |
| 分治 | 把大问题拆成相似小问题再合并 | 归并排序、快速排序、线段树、最近点对 | 子问题是否独立,合并成本是否可控 |
| 贪心 | 每一步选局部最优,并证明不会影响全局最优 | 区间调度、最小生成树、哈夫曼编码 | 必须有交换论证或最优子结构,不能凭直觉贪 |
| 动态规划 | 把重复子问题缓存起来,用状态转移组织答案 | 背包、编辑距离、路径计数、序列匹配 | 状态定义、转移方向、边界条件、空间压缩 |
| 回溯 / 搜索剪枝 | 系统枚举候选解,并尽早丢掉不可能分支 | 排列组合、约束满足、棋盘、子集搜索 | 剪枝是否正确,复杂度是否还能接受 |
| 工程问题 | 背后的结构 / 算法 | 继续看 |
| 代码 Big-O 没变,但数据量一大性能断崖 | 数组、对象布局、Cache 局部性、分支预测 | 计算机体系结构底座 |
| 数据库索引为什么不是普通二叉树 | B+ 树、磁盘页、范围扫描、局部性 | 数据库图谱 |
| 缓存淘汰为什么不只用 LRU | 队列、哈希表、频率估计、TinyLFU | 缓存工程 |
| 服务依赖为什么会出现环和级联故障 | 有向图、拓扑排序、连通性、传播路径 | 依赖治理 |
| 消息积压和任务调度怎样优化 | 队列、优先队列、背压、调度策略 | 消息队列 / 事件驱动 |
| 搜索推荐为什么要分召回和排序 | 倒排索引、向量检索、Top K、图关系 | 搜索 / 推荐 |
| 分布式系统为什么需要共识算法 | 状态机、日志复制、图中的多数派、故障模型 | 分布式系统图谱 |
| 阶段 | 先学什么 | 能做什么就算过关 |
| 入门阶段 | 数组、字符串、链表、栈、队列、哈希表、基础排序 | 能解释每种结构的增删查改代价,并能用它们写出清晰代码 |
| 核心阶段 | 递归、树、堆、二分、双指针、BFS / DFS、图的基础遍历 | 能把问题建成状态图或树,并能处理 visited、边界、路径恢复 |
| 进阶阶段 | 动态规划、贪心证明、并查集、拓扑排序、最短路、最小生成树 | 能说清状态、转移、正确性和复杂度,不只会套模板 |
| 工程阶段 | 缓存、索引、调度、批处理、流处理、依赖图、Benchmark | 能把结构选择和真实系统性能、内存、IO、并发约束接起来 |
| 如果你关心 | 继续看 | 分工说明 |
| 编程语法和零基础代码组织 | Java 编程语言基础 | 语言基础页负责变量、控制流、函数、对象和错误处理;本页负责结构与复杂度 |
| Java 集合、JVM、并发和面试题 | Java 面试深度指南 | 面试页适合做 Java 语境下的题目和知识点补充,本页负责专业课主线 |
| 代码在真实机器上为什么快慢不同 | 计算机系统底座 | 本页看抽象复杂度,系统底座看 CPU、内存、OS 和运行时约束 |
| 怎么验证优化是否真的有效 | 性能工程 | 性能页负责 profile、压测和回归治理,本页只提供算法与结构侧的候选解释 |
| 大学计算机专业课怎么串 | 大学计算机专业课程主线 | 课程页负责整体先修关系,本页是其中“数据结构与算法”这一门的正入口 |
| 规则 | 原因 | 执行方式 |
| 不把本页写成题库 | 题库会快速膨胀,也会压住主线结构 | 只保留结构、策略、分工和典型工程连接 |
| 不按单一语言解释全部结构 | 数据结构是跨语言概念,语言只是实现载体 | Java、Go、Python 的具体容器差异放到语言页或面试页 |
| 复杂度和系统性能同时保留 | 课程里只看 Big-O,工程里还要看内存、局部性、分配和并发 | 本页同时回链体系结构、性能工程、数据库和缓存页 |