Skip to content

数据结构

数据结构是组织和存储数据的方式,是算法设计的基础,直接影响程序的效率和可维护性。

📖 学习内容

📊 线性结构

  • 线性数据结构
    • 数组:连续存储、随机访问
    • 链表:动态插入删除、内存灵活
    • 栈:后进先出(LIFO)、函数调用
    • 队列:先进先出(FIFO)、任务调度

🌳 其他结构

  • 树形结构:层次关系、搜索效率
  • 图结构:复杂关系、网络问题

🎯 学习路径

📚 基础阶段

  • 线性结构:数组、链表、栈、队列
  • 基本概念:抽象数据类型、接口设计
  • 实现技巧:内存管理、指针操作
  • 复杂度分析:时间空间效率评估

🛠️ 进阶阶段

  • 树形结构:二叉树、平衡树、B树
  • 图结构:图的表示、遍历算法
  • 高级结构:并查集、线段树、树状数组
  • 哈希结构:哈希表、布隆过滤器

🚀 高级阶段

  • 持久化数据结构:版本控制、函数式编程
  • 并发数据结构:线程安全、锁机制
  • 缓存结构:LRU、LFU缓存算法
  • 分布式结构:分布式哈希表、一致性哈希

📊 数据结构分类

📈 线性数据结构

数组 (Array)

特点:

  • 连续内存存储,元素类型相同
  • 支持随机访问,O(1)时间复杂度
  • 插入删除需要移动元素,O(n)时间复杂度
  • 内存利用率高,缓存友好

应用场景:

  • 需要频繁随机访问
  • 数据量固定或变化不大
  • 多维数据表示

链表 (Linked List)

类型:

  • 单链表:单向指针,简单高效
  • 双链表:双向指针,插入删除方便
  • 循环链表:首尾相连,循环结构

特点:

  • 动态内存分配,插入删除O(1)
  • 不支持随机访问,需要遍历
  • 内存利用率较低,存在指针开销
  • 适合频繁插入删除场景

栈 (Stack)

实现方式:

  • 基于数组:固定大小,操作简单
  • 基于链表:动态大小,内存灵活

应用场景:

  • 函数调用栈管理
  • 表达式求值和转换
  • 撤销操作实现
  • 深度优先搜索

队列 (Queue)

类型:

  • 普通队列:FIFO原则
  • 循环队列:固定内存,高效利用
  • 优先队列:按优先级出队
  • 双端队列:两端都可以操作

应用场景:

  • 任务调度系统
  • 消息队列
  • 广度优先搜索
  • 缓冲区管理

🌳 树形数据结构

二叉树 (Binary Tree)

基本概念:

  • 节点最多两个子节点:左孩子、右孩子
  • 二叉搜索树:左子树小于根,右子树大于根
  • 平衡二叉树:高度差不超过1,保证效率

遍历方式:

  • 前序遍历:根-左-右
  • 中序遍历:左-根-右(二叉搜索树有序)
  • 后序遍历:左-右-根
  • 层次遍历:按层从左到右

平衡搜索树

AVL树: 严格平衡,旋转操作较多 红黑树: 近似平衡,实际应用广泛 B树: 多路搜索树,适合外存储 B+树: 叶子节点链表,数据库索引

其他树结构

字典树(Trie): 字符串搜索,前缀匹配 线段树: 区间查询,动态更新 树状数组: 区间和查询,单点更新 并查集: 集合合并,连通性判断

🕸️ 图数据结构

图的表示

邻接矩阵:

  • 二维数组存储,O(1)边查询
  • 空间复杂度O(V²),适合稠密图
  • 矩阵运算方便,算法实现简单

邻接表:

  • 链表数组存储,O(V+E)空间
  • 适合稀疏图,内存效率高
  • 遍历相对复杂

图算法

遍历算法:

  • 深度优先搜索(DFS):递归实现,栈辅助
  • 广度优先搜索(BFS):队列实现,最短路径

路径算法:

  • Dijkstra:单源最短路径,正权图
  • Floyd-Warshall:全对最短路径
  • A*算法:启发式搜索,路径规划

最小生成树:

  • Prim算法:基于顶点,适合稠密图
  • Kruskal算法:基于边,适合稀疏图

🗃️ 哈希结构

哈希表

基本原理:

  • 哈希函数:键值映射到数组索引
  • 冲突解决:链地址法、开放地址法
  • 动态扩容:负载因子管理

特点:

  • 平均O(1)的插入、删除、查找
  • 最坏情况O(n),需要良好哈希函数
  • 空间换时间,内存占用较大

应用场景:

  • 缓存实现
  • 字典、集合数据结构
  • 数据库索引
  • 去重操作

布隆过滤器

特点:

  • 可能的假阳性,无假阴性
  • 空间效率极高,适合大规模数据
  • 支持删除的变种:Counting Bloom Filter

应用场景:

  • 网页URL去重
  • 垃圾邮件过滤
  • 缓存穿透防护

🛠️ 实现技巧

🎨 设计原则

  • 抽象接口:数据结构与具体实现分离
  • 泛型设计:支持多种数据类型
  • 异常处理:边界检查、错误处理
  • 内存管理:避免内存泄漏、高效分配

⚡ 性能优化

  • 空间优化:位域、紧凑存储
  • 缓存友好:数据局部性、预取
  • 并行优化:读写分离、无锁数据结构
  • 算法优化:批量操作、延迟更新

📚 学习资源

📖 经典教材

  • 数据结构与算法分析:理论基础扎实
  • 算法导论:权威参考,内容全面
  • 数据结构(C语言版):实现细节丰富
  • Java数据结构与算法:面向对象设计

🌟 在线资源

  • 可视化工具:数据结构动画演示
  • 在线练习:LeetCode、HackerRank
  • 开源项目:高质量数据结构实现
  • 技术博客:深入分析和应用案例

数据结构是程序的骨架,好的结构让算法如虎添翼!

Released under the MIT License.