在数据结构笔试中,核心围绕 “数据的逻辑结构、存储结构、操作效率、经典算法思想” 四大维度展开。
一、基础概念:数据结构的 “骨架”
1. 数据结构的核心三要素
- 逻辑结构:数据元素之间的 “逻辑关系”(与存储无关),分为两类:
- 线性结构:元素间一对一,如数组、链表、栈、队列、串。
- 非线性结构:元素间一对多 / 多对多,如树(一对多)、图(多对多)、集合(无逻辑关系)。
- 存储结构(物理结构):逻辑结构在计算机中的 “实际存储方式”,决定操作效率,核心有 4 种:
存储结构 | 特点 | 典型应用 |
---|
顺序存储 | 元素连续存放,用下标访问 | 数组、顺序栈、顺序队列 |
链式存储 | 元素分散存放,用指针 / 引用连接 | 单链表、双链表、链栈 |
索引存储 | 额外建 “索引表”(key + 地址),加速查找 | 数据库索引 |
散列存储(哈希) | 元素 key 通过哈希函数直接映射到存储地址 | 哈希表、HashMap |
- 数据运算:对数据元素的操作(增删改查、排序、遍历),运算效率由 “逻辑结构 + 存储结构” 共同决定(如数组查快删慢,链表删快查慢)。
2. 时间复杂度与空间复杂度
- 时间复杂度(T (n)):算法执行 “基本操作次数” 与问题规模 n 的关系,只保留最高次项(忽略常数、低次项)。
- 常见复杂度排序(从优到劣):
O(1) < O(log₂n) < O(n) < O(nlog₂n) < O(n²) < O(n³) < O(2ⁿ) < O(n!)
- 高频场景:
- O (1):数组随机访问、哈希表查找(无冲突时);
- O (log₂n):二分查找、平衡二叉树(AVL、红黑树)的增删查;
- O (n):线性查找、链表遍历;
- O (n²):冒泡排序、插入排序、简单选择排序(双层循环)。
- 空间复杂度(S (n)):算法执行时 “额外占用存储空间” 与 n 的关系(不包含输入数据的空间)。
- 常见场景:
- O (1):原地排序(冒泡、插入)、迭代算法(无额外数组 / 栈);
- O (n):递归(递归栈深度为 n)、额外开辟大小为 n 的数组。
二、线性结构
1. 数组 vs 链表
对比维度 | 数组(顺序存储) | 链表(链式存储) |
---|
访问效率 | O (1)(随机访问) | O (n)(需遍历) |
增删效率 | O (n)(需移动元素) | O (1)(已知前驱 / 后继时) |
存储空间 | 静态分配(大小固定) | 动态分配(按需申请) |
内存碎片 | 无(连续存储) | 有(分散存储) |
典型应用 | 需频繁访问的场景(如矩阵、查找表) | 需频繁增删的场景(如链表队列、邻接表) |
2. 栈:“先进后出(LIFO)” 的线性表
- 定义:只允许在 “栈顶” 进行增(push)、删(pop)的线性表,栈底固定。
- 存储:
- 顺序栈:用数组实现,需注意 “栈满(top == 数组长度 - 1)” 和 “栈空(top == -1)”;
- 链栈:用链表实现,栈顶为链表头(无需考虑栈满,只需判断栈空:head == null)。
- 高频应用:括号匹配、表达式求值(后缀表达式)、函数调用栈、递归的非递归实现。
3. 队列:“先进先出(FIFO)” 的线性表
- 定义:只允许在 “队尾” 增(enqueue)、“队头” 删(dequeue)的线性表。
- 存储与关键问题:
- 顺序队列:用数组实现,易出现 “假溢出”(队尾满但队头有空位);
- 循环队列(笔试重点):解决假溢出,将数组视为环形,核心是 “判空 / 判满条件”:
- 判空:
front == rear
(队头和队尾指针重合); - 判满:
(rear + 1) % 数组长度 == front
(预留一个空位,避免与判空混淆)。
- 高频应用:进程调度(操作系统)、缓冲区(如 IO 缓冲)、广度优先搜索(BFS)。
4. 串(字符串)
- 定义:由字符构成的线性表(特殊线性表),长度为 0 的串称为 “空串”(""),注意与 “空格串”(" ")区分。
- 子串:串中任意连续字符组成的子序列(如 “abc” 的子串有 “a”“ab”“abc” 等),笔试常考 “子串个数计算”(长度为 n 的串,子串个数为 n (n+1)/2 + 1,+1 是空串)。
- 模式匹配:在主串中找子串(模式串)的位置,笔试考算法概念:
- 暴力匹配(BF 算法):逐个比对,时间复杂度 O (mn)(m 为主串长度,n 为模式串长度);
- KMP 算法:利用 “部分匹配表(next 数组)” 跳过重复比对,时间复杂度 O (m+n)(无需掌握代码,但需知道 “优化暴力算法” 的核心思想)。
三、非线性结构
1. 树:“一对多” 的层次结构
(1)树的基本概念(必背)
- 节点关系:父节点、子节点、兄弟节点、叶子节点(无子女)、非叶子节点(有子女);
- 树的属性:
- 深度:从 “根节点” 到该节点的路径长度(根深度为 1 或 0,笔试需看题干定义);
- 高度:从该节点到 “最远叶子” 的路径长度(叶子高度为 1);
- 度:节点的子节点个数(树的度是所有节点度的最大值)。
- 森林:m 棵互不相交的树的集合(树是森林的特殊情况,m=1)。
(2)二叉树:“每个节点最多 2 个子树”
特殊二叉树:
类型 | 定义 | 关键性质 |
---|
满二叉树 | 所有叶子在同一层,非叶子度均为 2 | 深度为 k 时,节点总数 = 2ᵏ - 1 |
完全二叉树 | 按层序编号,每个节点编号与满二叉树一致(叶子只在最后两层) | ① n 个节点的完全二叉树,深度 =⌊log₂n⌋ + 1;② 父节点 i 的左子树 = 2i,右子树 = 2i+1(i 从 1 开始) |
二叉搜索树(BST) | 左子树值 < 根值 < 右子树值(中序遍历为升序) | 无平衡限制,最坏情况下退化为链表(查找 O (n)) |
平衡二叉树(AVL) | BST + 左右子树高度差≤1 | 确保查找、增删效率均为 O (log₂n),平衡调整通过 “旋转”(LL、RR、LR、RL) |
二叉树的遍历:
- 前序遍历(根→左→右);
- 中序遍历(左→根→右);
- 后序遍历(左→右→根);
- 层序遍历(按层从左到右,用队列实现)。
- 高频题:已知前序 + 中序,推导后序(或反之),核心是 “前序找根,中序分左右子树”。
(3)哈夫曼树(最优二叉树)
- 定义:n 个叶子节点的二叉树中,“带权路径长度(WPL)最小” 的树(WPL=Σ 叶子权值 × 路径长度)。
- 构建规则:每次选权值最小的两个节点作为左右子树,新节点权值为二者之和,重复至只剩一个节点。
- 应用:哈夫曼编码(前缀编码,无歧义,用于数据压缩)。
2. 图:“多对多” 的复杂结构
(1)图的基本概念
- 分类:
- 按边有无方向:无向图(边用 (u,v) 表示)、有向图(边用 < u,v > 表示,分入度 / 出度);
- 按边有无权值:无权图、带权图(网);
- 特殊图:完全图(无向图:n 个节点有 n (n-1)/2 条边;有向图:n (n-1) 条边)、稀疏图(边少)、稠密图(边多)。
- 连通性:
- 无向图:两点间有路径→连通;所有节点连通→连通图;极大连通子图→连通分量;
- 有向图:两点间双向有路径→强连通;所有节点强连通→强连通图;极大强连通子图→强连通分量。
(2)图的存储结构(笔试常考对比)
存储方式 | 特点 | 适用场景 |
---|
邻接矩阵 | 用二维数组存储边(A [i][j] 表示节点 i 到 j 的边) | 稠密图(空间 O (n²),访问边效率 O (1)) |
邻接表 | 用 “数组 + 链表” 存储(数组存节点,链表存邻接节点) | 稀疏图(空间 O (n+e),e 为边数,遍历邻接节点效率高) |
(3)图的遍历(与树遍历对比)
- 深度优先搜索(DFS):类似树的前序遍历,用栈 / 递归实现,“一条路走到底,回溯再走其他路”;
- 广度优先搜索(BFS):类似树的层序遍历,用队列实现,“按层遍历,先访问当前节点的所有邻接节点”;
- 考点:遍历序列推导、基于遍历判断连通性、找路径。
四、查找与排序
1. 查找:从数据集中找目标元素
查找算法 | 适用结构 | 平均时间复杂度 | 特点 |
---|
线性查找 | 任意序列(数组 / 链表) | O(n) | 简单,无需有序 |
二分查找 | 有序数组(顺序存储) | O(log₂n) | 高效,需有序 + 随机访问 |
二叉搜索树(BST)查找 | 二叉搜索树 | O (log₂n)(平衡时)/ O (n)(失衡时) | 动态查找(支持增删),依赖树的平衡性 |
哈希查找 | 哈希表 | O (1)(理想无冲突) | 最快,需解决冲突(开放地址法、链地址法) |
2. 排序:将序列按规则排列
排序类别 | 算法 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性(相同元素相对位置不变) |
---|
插入类 | 直接插入排序 | O(n²) | O(n²) | O(1) | 稳定 |
| 希尔排序 | O(n¹.³) | O(n²) | O(1) | 不稳定 |
交换类 | 冒泡排序 | O(n²) | O(n²) | O(1) | 稳定 |
| 快速排序 | O(nlog₂n) | O(n²) | O (log₂n)(递归栈) | 不稳定 |
选择类 | 简单选择排序 | O(n²) | O(n²) | O(1) | 不稳定 |
| 堆排序 | O(nlog₂n) | O(nlog₂n) | O(1) | 不稳定 |
归并类 | 归并排序 | O(nlog₂n) | O(nlog₂n) | O (n)(额外数组) | 稳定 |
基数类 | 基数排序 | O (d (n+r))(d 为位数,r 为基数) | O(d(n+r)) | O(n+r) | 稳定 |