数据结构(一)前置知识

数据结构学什么?

── 基础

│ ├── 概念

│ ├── 算法

│ └── 复杂度

── 线性结构

│ ├── 顺序表

│ ├── 链表

│ ├── 栈

│ └── 队列

── 非线性结构

│ ├── 树

│ └── 图

── 查找

── 排序

① 基础概念层

模块 核心内容 你需要掌握什么
数据 什么是数据、数据元素、数据项 会区分概念
数据结构 逻辑结构 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就要数据结构上机考了,时间过得好快,真的要抓紧复习了)

相关推荐
zore_c2 小时前
【C语言】排序算法——快速排序详解(含多种变式)!!!
c语言·数据结构·笔记·算法·排序算法·深度优先·推荐算法
客梦2 小时前
数据结构--哈希表
数据结构·笔记
永远睡不够的入2 小时前
记数排序(基数排序和桶排序)
数据结构
月明长歌3 小时前
【码道初阶】Leetcode138:随机链表的复制:用 HashMap 做深拷贝的标准解法
java·数据结构·算法·leetcode·链表·哈希算法
喜欢吃燃面3 小时前
算法竞赛中的数据结构:图
开发语言·数据结构·c++·学习·算法
youngee113 小时前
hot100-54在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
草莓熊Lotso3 小时前
《算法闯关指南:递归,搜索与回溯算法--递归》--02. 合并两个有序链表,03. 反转链表
运维·数据结构·算法·链表
1001101_QIA3 小时前
vector学习笔记
数据结构·算法
(❁´◡`❁)Jimmy(❁´◡`❁)3 小时前
【数据结构】 Treap1: 插入,删除,查找,旋转
数据结构·算法