数据结构与算法的分类需兼顾 逻辑特性、应用场景、核心目标 三大维度,以下是系统性的分类框架,既覆盖基础理论,也贴合工程实践:
一、数据结构分类(按「逻辑结构+存储结构+核心功能」划分)
数据结构的核心是「组织数据的方式」,分类需区分「逻辑上如何关联」和「物理上如何存储」,再结合功能场景细化:
1. 按逻辑结构分类(数据元素间的关联关系)
| 类别 | 定义 | 核心特点 | 典型例子 |
|---|---|---|---|
| 线性结构 | 数据元素按「线性顺序」排列,除首尾外每个元素仅有一个前驱和一个后继 | 一对一关系,顺序访问高效 | 数组、链表、栈、队列、字符串 |
| 非线性结构 | 数据元素间为「一对多」或「多对多」关系 | 可分支/网状关联,查找/关联高效 | 树、图、堆、哈希表 |
2. 按存储结构分类(数据在内存中的物理存储方式)
| 类别 | 定义 | 核心特点 | 对应逻辑结构 |
|---|---|---|---|
| 顺序存储结构 | 数据元素连续存储在内存的「连续地址空间」 | 随机访问O(1),插入删除O(n) | 数组、栈(顺序实现)、队列(顺序实现) |
| 链式存储结构 | 数据元素分散存储,通过「指针/引用」关联前驱/后继元素 | 插入删除O(1),随机访问O(n) | 链表、树(链式实现)、图(邻接表) |
| 索引存储结构 | 额外建立「索引表」,记录数据元素的关键字与存储地址映射 | 查找O(1)~O(logn),额外空间开销 | 数据库索引、哈希表(索引+数组) |
| 散列存储结构(哈希) | 直接通过「哈希函数」计算数据元素的存储地址,无需顺序/指针关联 | 查找/插入/删除均O(1)(理想) | 哈希表、布隆过滤器 |
3. 按核心功能分类(工程中常用的场景化划分)
| 类别 | 核心用途 | 典型结构 |
|---|---|---|
| 线性存储结构 | 按顺序/先进先出/后进先出管理数据 | 数组、链表、栈、队列、双端队列 |
| 树形结构 | 层级化组织数据(一对多),用于排序、搜索、分层遍历 | 二叉树、二叉搜索树(BST)、红黑树、B树/B+树、堆、Trie树 |
| 图形结构 | 网状组织数据(多对多),用于描述关联关系(路径、依赖等) | 有向图、无向图、加权图、邻接矩阵/邻接表 |
| 映射结构 | 键值对关联,用于快速查找/映射(核心是「键→值」的高效映射) | 哈希表、跳表、有序映射(TreeMap) |
| 集合结构 | 存储不重复元素,支持交集、并集、差集等操作 | 哈希集合(HashSet)、有序集合(TreeSet)、布隆过滤器 |
二、算法分类(按「核心目标+解题思路+应用场景」划分)
算法的核心是「解决问题的步骤」,分类需突出「时间复杂度、空间复杂度、解题逻辑」的差异:
1. 按核心目标分类(优化方向)
| 类别 | 核心目标 | 典型算法 |
|---|---|---|
| 查找算法 | 从数据集合中快速找到目标元素 | 二分查找、哈希查找、二叉搜索树查找、跳表查找 |
| 排序算法 | 将数据集合按指定顺序(升序/降序)排列 | 冒泡排序、快速排序、归并排序、堆排序、基数排序 |
| 搜索算法 | 在图/树中寻找「路径/目标节点」(比查找更复杂,涉及状态遍历) | 深度优先搜索(DFS)、广度优先搜索(BFS)、Dijkstra算法、A*算法 |
| 动态规划算法 | 分解复杂问题为「重叠子问题」,通过缓存子问题结果避免重复计算 | 斐波那契数列、最长公共子序列(LCS)、背包问题、最短路径(Floyd-Warshall) |
| 贪心算法 | 每一步选择「局部最优解」,最终逼近全局最优解(需满足贪心选择性质) | 哈夫曼编码、最小生成树(Prim/Kruskal)、活动选择问题 |
| 分治算法 | 将问题分解为「独立子问题」,递归求解后合并结果 | 归并排序、快速排序、大数乘法(Karatsuba) |
| 回溯算法 | 按「深度优先」尝试所有可能解,不满足条件时回溯(暴力搜索的优化) | 全排列、组合总和、N皇后问题、子集问题 |
| 字符串算法 | 处理字符串匹配、编辑、转换等问题 | KMP算法、BM算法、Rabin-Karp算法、字符串编辑距离 |
| 图算法 | 处理图的遍历、连通性、路径、生成树等问题 | 拓扑排序、并查集(Union-Find)、最小生成树、最短路径 |
2. 按时间复杂度分类(效率等级)
| 复杂度级别 | 名称 | 特点(n为数据规模) | 典型算法 |
|---|---|---|---|
| O(1) | 常数时间算法 | 效率最高,与n无关 | 哈希表查找/插入、数组随机访问 |
| O(logn) | 对数时间算法 | 效率极高,n增大时增长缓慢 | 二分查找、红黑树插入/查找 |
| O(n) | 线性时间算法 | 效率较高,与n成正比 | 线性查找、计数排序、BFS(图节点遍历) |
| O(nlogn) | 线性对数时间算法 | 高效排序的主流复杂度 | 快速排序、归并排序、堆排序 |
| O(n²) | 平方时间算法 | 效率一般,n较大时性能下降 | 冒泡排序、插入排序、简单回溯 |
| O(2ⁿ) / O(n!) | 指数/阶乘时间算法 | 效率极低,仅适用于小规模数据 | 暴力全排列、TSP问题(暴力解) |
3. 按空间复杂度分类(内存开销)
| 类别 | 特点 | 典型算法 |
|---|---|---|
| 原地算法(O(1)空间) | 仅使用常数额外空间,不依赖额外数据结构 | 冒泡排序、插入排序、堆排序(in-place实现) |
| 线性空间算法(O(n)) | 需额外使用与n成正比的空间 | 归并排序、线性表复制、BFS(队列存储节点) |
| 递归空间算法(O(logn)~O(n)) | 递归调用栈占用空间(与递归深度相关) | 快速排序(递归栈O(logn))、DFS(递归栈O(n)) |
三、核心关联:数据结构与算法的绑定关系
很多算法是为特定数据结构设计的,二者不可分割:
- 数组/链表 → 线性查找、冒泡排序、插入排序
- 二叉搜索树/红黑树 → 二叉查找、中序遍历排序
- 哈希表 → 哈希查找、哈希集合操作
- 图 → DFS/BFS、Dijkstra算法、并查集
- 堆 → 堆排序、优先队列(TopK问题)
- 字符串 → KMP、Rabin-Karp匹配算法
总结
- 数据结构的核心是「组织数据」,分类围绕「逻辑关联、物理存储、功能场景」;
- 算法的核心是「解决问题」,分类围绕「优化目标、效率等级、解题思路」;
- 工程实践中,需根据问题场景选择「适配的数据结构+高效的算法」(如:快速查找用哈希表,有序查找用二叉搜索树,大规模排序用归并/堆排序)。