数据结构学什么?
── 基础
│ ├── 概念
│ ├── 算法
│ └── 复杂度
── 线性结构
│ ├── 顺序表
│ ├── 链表
│ ├── 栈
│ └── 队列
── 非线性结构
│ ├── 树
│ └── 图
── 查找
── 排序
① 基础概念层
| 模块 | 核心内容 | 你需要掌握什么 |
|---|---|---|
| 数据 | 什么是数据、数据元素、数据项 | 会区分概念 |
| 数据结构 | 逻辑结构 vs 存储结构 | 知道"逻辑"和"物理" |
| 算法 | 算法定义、特性 | 会判断一个过程是不是算法 |
| 复杂度 | 时间复杂度、空间复杂度 | 会算 O( ) |
② 线性结构
| 结构 | 逻辑特点 | 典型存储 | 常考操作 |
|---|---|---|---|
| 顺序表 | 连续、一对一 | 数组 | 插入、删除 |
| 链表 | 非连续、一对一 | 指针 | 插入、删除 |
| 栈 | 后进先出(LIFO) | 数组 / 链表 | 入栈、出栈 |
| 队列 | 先进先出(FIFO) | 数组 / 链表 | 入队、出队 |
③ 非线性结构(难点 & 拉开差距)
(1)树结构
| 内容 | 你要会什么 |
|---|---|
| 树的基本概念 | 根、父子、层次、度 |
| 二叉树 | 满/完全二叉树 |
| 二叉树遍历 | 前序 / 中序 / 后序(递归) |
| 二叉搜索树 | 左小右大 |
| 堆 | 完全二叉树 + 堆序性 |
(2)图结构
| 内容 | 你要会什么 |
|---|---|
| 图的概念 | 顶点、边、有向/无向 |
| 存储 | 邻接矩阵、邻接表 |
| 遍历 | DFS、BFS |
| 应用 | 最短路径、最小生成树 |
④ 查找结构(效率核心)
| 查找方法 | 适用结构 | 复杂度 |
|---|---|---|
| 顺序查找 | 任意 | O(n) |
| 二分查找 | 有序表 | O(log n) |
| 哈希表 | 关键字 | 平均 O(1) |
⑤ 排序算法(重点 & 高频)
| 排序 | 思想 | 时间复杂度 |
|---|---|---|
| 冒泡 | 交换 | O(n²) |
| 选择 | 选择最值 | O(n²) |
| 插入 | 插牌 | O(n²) |
| 快速排序 | 分治 | O(n log n) |
| 归并排序 | 分治 | O(n log n) |
| 堆排序 | 堆 | O(n log n) |
数据结构离不开指针。
-
数组:结构是"连续的",可以不用指针显式连接
-
链表 / 树 / 图:结构是"靠指针连起来的"。
int a = 10;
int *p = &a; -
a:普通变量,存值 10 -
&a:a 的地址 -
p:指针变量,里面存的是 a 的地址
指针本质也是变量,只是值比较特殊(地址)
| 符号 | 含义 |
|---|---|
& |
取地址 |
* |
通过地址访问内容(解引用) |
前置知识复习
1.指针和数组
数组名 ≈ 指向首元素的指针
int arr[3] = {1,2,3};
int *p = arr; // 等价于 &arr[0]
指针访问数组
printf("%d\n", *(p + 1)); // 2 等价于:arr[1]
2.指针运算
int *p;
p + 1 // 地址 + sizeof(int)
3.指针与函数
数据结构需要修改结构本身, 普通写法(改不了实参)
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
所有链表插入 / 删除,本质都是这个思想
4.结构体 + 指针
struct Node {
int data;
struct Node *next; //结点指向下一个结点
};
struct Node *p;
p->data; // 等价于 (*p).data
p->next;
5.动态内存
-
链表长度不固定
-
运行时才知道要多少结点
所以不用数组,必须动态申请
struct Node *p = (struct Node *)malloc(sizeof(struct Node));
二.内在空间分配
在程序运行前或创建时 ,为数据结构一次性分配一块连续的存储空间 ,在使用过程中不能或不方便改变大小。
| 区域 | 特点 |
|---|---|
| 栈(stack) | 自动分配,函数结束释放 |
| 堆(heap) | 手动申请 & 手动释放 |
| 全局区 | 全局变量 |
| 常量区 | 字符串常量 |
1.栈:自动分配,自动回收
| 特点 | 说明 |
|---|---|
| 分配快 | 由系统自动完成 |
| 空间小 | 一般几 MB |
| 生命周期短 | 函数结束就没 |
| 不可返回 | 不能返回栈变量地址 |
2.堆区:malloc / calloc / realloc 申请的空间
指针在栈,指向的数据在堆
| 特点 | 说明 |
|---|---|
| 手动管理 | 你 malloc,你 free |
| 空间大 | 远大于栈 |
| 生命周期长 | 直到 free |
| 灵活 | 运行时决定大小 |
3.全局区
存放全局变量和静态变量的内存区域
-
生命周期:整个程序运行期间
-
默认初始化为 0
-
不随函数调用结束而释放
4.常量区
专门存放常量的内存区域
三.时间复杂度
描述 算法执行时间随输入规模 n增长的变化趋势。
常见时间复杂度
| 复杂度 | 名称 | 例子 |
|---|---|---|
| O(1) | 常数 | 数组访问 |
| O(log n) | 对数 | 二分查找 |
| O(n) | 线性 | 顺序遍历 |
| O(n log n) | 线性对数 | 快排、归并 |
| O(n²) | 平方 | 冒泡、选择 |
| O(2ⁿ) | 指数 | 递归枚举 |
排序(从快到慢):
O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ)
四.空间复杂度(不重要)
描述算法在运行过程中**额外占用存储空间,**随输入规模 n 增长的变化趋势。
常见空间复杂度
| 空间复杂度 | 说明 |
|---|---|
| O(1) | 只用常量空间 |
| O(n) | 申请了 n 大小辅助空间 |
| O(log n) | 递归栈深度 |
五.抽象数据结构ADT(不重要)
是对一类数据及其操作的逻辑描述,,只关心"能做什么",不关心"怎么做"。
(这是我的期末复习笔记,希望对你们也有帮助。1.4就要数据结构上机考了,时间过得好快,真的要抓紧复习了)