序言

实践是检验真理的唯一标准。

——改革开放的总设计师邓小平同志

如何将一个理论上可行的想法变成切实可行的方案,一直是科学与技术在不断探究的本源性问题之一。同时这也是我们在学习中易于忽视的问题,因为任何编程语言的标准库对于经典的数据结构都会有一个完美的封装,以至于我们完全可以轻而易举地利用这些库来完成日常作业。然而,思考这些库的设计过程并亲手实现一个这样的库,对于我们理解各种编程语言的设计原理和计算机底层的运作过程是大有裨益的。

与大部分通用的数据结构设计教程不同,本教程将主要聚焦于如何使用Rust来实现数据结构而不是深究数据结构本身,并和一些其它语言对比以展示Rust的设计思想。因此本教程默认读者已经具备基本的数据结构的常识,以及完成基本的Rust语言知识的学习。具体可以参考以下的一些优秀的项目:

  • 数据结构与算法基础
    • Hello算法:简单而生动,涵盖多种语言实现
  • Rust学习
    • Rustling:如果你倾向于做题来学习一门语言
    • Rust Book:Rust官方语言学习指导书

其次,本项目包含对于单元测试,基准测试(基准测试基于Criterion库)和文档测试的构建,你可以通过以下命令进行构建:

  • cargo test:运行单元测试
  • cargo bench:运行基准测试
  • cargo doc --open:运行文档测试并在浏览器中打开

另外,目前的进度可以在这里概览:

  • 数据结构实现
    • 🔴表示未完成
    • 🟡表示进行中
    • 🟢表示已完成
  • 测试&文档
    • ❌表示未完成
    • ✅表示已完成
数据结构实现方式单元测试基准测试文档注释
🟢 Box链表基于Box指针
🟢 Rc链表基于Rc指针和RefCell指针
🔴 NonNull链表基于NonNull指针并自行管理生命周期
🔴 双向链表基于Box指针
🔴 栈 (Stack)基于数组或链表实现
🔴 队列 (Queue)基于数组或链表实现
🔴 二叉树 (Binary Tree)基于节点和指针实现
🔴 平衡二叉树 (Balanced Binary Tree)基于二叉树,通过旋转等操作维持平衡
🔴 二叉搜索树 (BST)基于二叉树,遵循左小右大的原则
🔴 堆 (Heap)基于数组实现,通过索引关系维护父子节点
🔴 Trie (字典树)基于节点和指针实现,每个节点表示一个字符
🔴 B树 (B-tree)基于节点和指针实现,节点包含多个关键字和子节点指针
🔴 B+树 (B+ Tree)基于B树,所有键都出现在叶子节点的链表中
🔴 无向图 (Undirected Graph)基于邻接矩阵或邻接表实现
🔴 有向图 (Directed Graph)基于邻接矩阵或邻接表实现
🔴 加权图 (Weighted Graph)基于邻接矩阵或邻接表实现,存储权重信息
🔴 邻接矩阵 (Adjacency Matrix)基于二维数组实现
🔴 邻接表 (Adjacency List)基于链表或向量实现
🔴 有向无环图 (DAG)基于邻接矩阵或邻接表实现,保证无环
🔴 图的遍历方法基于递归或队列实现DFS和BFS
🔴 哈希表 (Hash Table)基于数组和哈希函数实现,处理哈希冲突
🔴 哈希集合 (Hash Set)基于哈希表实现,存储不重复元素
🔴 哈希映射 (Hash Map)基于哈希表实现,存储键值对
🔴 集合 (Set)基于哈希表或平衡二叉树实现
🔴 映射 (Map)基于哈希表或平衡二叉树实现
🔴 哈希映射 (HashMap)基于哈希表实现
🔴 树映射 (TreeMap)基于红黑树实现
🔴 堆栈树 (Stack Tree)基于栈和树的结合实现
🔴 并查集 (Disjoint Set Union, DSU)基于数组或链表实现,通过路径压缩和按秩合并优化
🔴 位图 (Bitmap)基于位数组实现
🔴 跳表 (Skip List)基于链表和随机化实现多级索引
🔴 计数器 (Counter)基于哈希表实现,统计元素出现次数