📚 数据结构 (Data Structures)
1. 线性结构
- 数组 (Array):连续存储的相同类型元素集合。支持随机访问(O(1)),但插入/删除平均需移动半数元素(O(n))1,2。
- 链表 (Linked List):
- 单链表:节点包含
数据域和后继指针(next)。插入删除操作(给定前驱时)为 O(1),但查找需遍历(O(n))1,2。 - 双链表:节点包含
前驱指针(prior), 数据域, 后继指针(next)。可双向遍历1,2。 - 循环链表:尾节点指向头节点(或头结点)。判断循环结束条件变为
p != L(L为头指针)1。
- 栈 (Stack):后进先出 (LIFO)。顺序栈(数组实现)和链栈(链表实现)1,3。应用:函数调用栈、表达式求值、括号匹配1,3。
- 队列 (Queue):先进先出 (FIFO)。
- 循环队列:基于数组,通过
front和rear指针模运算解决“假溢出”2。
- 队空:
Q.front == Q.rear;队满:(Q.rear + 1) % MaxSize == Q.front(牺牲一个单元)2。
- 链队列:通常带有
头结点的单链表2。 - 双端队列 (Deque):两端都可插入删除3。
2. 树与二叉树
- 二叉树 (Binary Tree):
- 性质:
- 第 i 层至多有
2^(i-1) 个节点 (i>=1)。 - 深度为 k 的二叉树至多有
2^k - 1 个节点 (k>=1)。 - 叶子节点数 n0 = 度为2的节点数 n2 + 1 (
n0 = n2 + 1)。 - 具有 n 个节点的完全二叉树深度为
⌊log₂n⌋ + 11,2。
- 存储:
- 顺序存储:适用于完全二叉树。
- 链式存储 (二叉链表):
lchild | data | rchild1,2。
- 遍历:
- 先序 (根左右)、中序 (左根右)、后序 (左右根):递归或借助栈实现。
- 层次遍历:借助队列实现1,3。
- 线索二叉树:利用空指针指向遍历序列的前驱或后继(
ltag和rtag标识指针含义)1。
- 树和森林:
- 存储结构:双亲表示法、孩子表示法、孩子兄弟表示法(可将树转换为二叉树)1。
- 森林与二叉树转换:森林中每棵树转为二叉树后,将后续二叉树作为前一颗二叉树根节点的右子树1。
- 遍历:树的先根遍历序列与其孩子兄弟表示法二叉树的先序序列相同;后根遍历与中序序列相同1。
- 应用:
- 二叉排序树 (BST):左子树节点值均小于根,右子树均大于根。中序遍历序列递增1,4。
- 平衡二叉树 (AVL):任意节点左右子树高度差绝对值不超过1。通过旋转(LL, RR, LR, RL)调整失衡1,4。
- 哈夫曼树 (Huffman Tree):带权路径长度 (WPL) 最小的二叉树(贪心算法构造)。用于哈夫曼编码(可变长前缀编码)1,4。
3. 图 (Graph)
- 存储结构:
- 邻接矩阵:
n x n 矩阵,A[i][j]表示边。适用于稠密图,判断边、求度高效,但空间复杂度 O(n²)1,4。 - 邻接表:为每个顶点建立边表(单链表)。适用于稀疏图,节省空间,但找入边难1,4。
- 十字链表 (有向图)、邻接多重表 (无向图):分别高效处理有向图和无向图的相关操作1。
- 遍历:
- 广度优先搜索 (BFS):借助队列。可求无权图单源最短路径1,4。
- 深度优先搜索 (DFS):递归或借助栈1,4。
- 应用:
- 最小生成树 (MST):
- Prim算法:贪心,适用于稠密图,O(|V|²)1,4。
- Kruskal算法:并查集判环,适用于稀疏图,O(|E|log|E|)1,4。
- 最短路径:
- Dijkstra算法:单源,无负权边。贪心,O(|V|²)1,4。
- Floyd算法:各顶点对之间。动态规划,O(|V|³)1,4。
- 拓扑排序:对有向无环图 (DAG) 产生一个线性序列(表示事件先后顺序)。通过选择入度为0的顶点并删除其出边实现1,4。
- 关键路径:在AOE网中求最长路径(决定总工期)。求事件最早发生时间
ve 和最迟发生时间 vl,活动最早开始时间 e 和最迟开始时间 l。关键活动满足 l(a) - e(a) = 01,4。
4. 查找 (Searching)
- 基本概念:平均查找长度 (ASL) 衡量性能1,2。
- 顺序查找:ASL成功
(n+1)/2,失败 n+12。对有序表、无序表均可1。 - 折半查找 (二分查找):要求有序顺序表。ASL ≈
log₂(n+1) - 12。判定树是平衡二叉排序树2。 - 分块查找:块间有序,块内无序。ASL 为索引查找与块内查找之和1,2。
- B树和B+树:
- B树 (多路平衡查找树):m阶B树满足:根节点至少2棵子树,非根节点至少
⌈m/2⌉ 棵子树;所有叶子在同一层。用于磁盘索引1,2。 - B+树:与B树主要区别:非叶节点仅作索引,叶子节点包含所有关键字并链在一起。更适合数据库索引1,2。
- 散列表 (Hash Table):
- 散列函数构造:直接定址法、除留余数法(常用)、数字分析法、平方取中法1,4。
- 处理冲突:
- 开放定址法:
(H(key) + di) % m,di可为线性探测、平方探测等1,4。 - 拉链法 (链地址法):将冲突关键字链在同一个单链表下1,4。
- 性能:取决于装填因子 α = n / m1。
5. 排序 (Sorting)
- 插入排序:
- 直接插入排序:稳定。最好(已有序)O(n),最坏/平均 O(n²)4。
- 折半插入排序:减少比较次数(约 O(n log n)),但移动次数未减少,总体仍 O(n²)4。
- 希尔排序 (Shell Sort):按增量分组插入,增量渐减。不稳定4。
- 交换排序:
- 冒泡排序:稳定。最好(已有序)O(n),最坏/平均 O(n²)4。
- 快速排序:分治,递归。平均 O(n log n),最坏(有序)O(n²)。不稳定4。
- 选择排序:
- 简单选择排序:不稳定。O(n²)4。
- 堆排序:
- 建堆(大根堆):从最后一个非叶节点开始调整。
- 排序:交换堆顶与末尾元素,调整剩余为堆。
- 不稳定。O(n log n)4。
- 归并排序:分治,稳定。O(n log n)。需要额外 O(n) 空间4。
- 基数排序:按位分配收集,稳定。O(d(n+r))4。
注:计算机组成原理、操作系统、计算机网络部分将后续补充。 1,2,3,4,5