该项目的目的是在Rust的语境下探讨数据结构与算法的最佳实践,对比我们的实现与标准实现的异同,有助于更好地理解为何它们会被实现成这样. 项目的推进动力来源于相关的数据结构与算法方面的杂题,并无明确的路线.
克隆本仓库:
git clone https://github.com/Nouzan/my-algo-rs.git
cd my-algo-rs
cargo doc
生成文档my-algo-rs/target/doc/my-algo/index.html
.从examples
和test
入手了解本项目.
创建新的二进制项目:
cargo new your-project
在cargo.toml
中添加对该项目的依赖:
[dependencies]
my-algo = { git = "https://github.com/Nouzan/my-algo-rs.git" }
在项目中引入一些结构,并尝试使用它们:
use my_algo::{
ch2::{IndexError, List, ListExt},
vec::MyVec,
};
fn main() -> Result<(), IndexError> {
let mut list = MyVec::new();
for i in 0..10 {
list.insert(list.len(), i)?;
}
list.shift(5)?;
for i in 0..list.len() {
println!("{}", list.get(i)?);
}
Ok(())
}
vec
)vec::MyVec
.ch1
)ch1::power
.ch1::{fib, fib_linear, fib_recurrence}
, 其中ch1::fib
是基于幂算法实现的, 复杂度为O(lgn)
.ch2
)ch2::{List, ListExt, PartialEqListExt, PartialOrdListExt}
, 为vec::MyVec
和Vec
实现了上述Trait
.ch2::ISizeListExt
.ch2::linked_list::{sll::LinkedList, shll::LinkedList}
.ch2::linked_list::cdll::LinkedList
.ch2::linked_list::{SinglyLinkedList, SinglyLinkedListExt}
.ch3
)ch3::{Stack, StackExt}
.ch3::{Queue, QueueExt}
.ch3::{SharedStack, DoubleStack}
, 并用共享栈、双栈实现Queue
(TODO: 有一些情况下判满算法会出错, 后面发一个issue描述一下情况).ch3::CircularQueue
.ch4
)BinTree, BinTreeMut, BinTreeCursor, BinTreeCursorMut
MoveParentBinTree, MoveParentBinTreeMut, MoveParentCursor, MoveParentCursorMut
vec_binary_tree::VecBinaryTree
linked_binary_tree::LinkedBinaryTree
doubly_linked_binary_tree::DoublyLinkedBinaryTree
compelete_heap::CompeleteMaxHeap
left_heap::LeftHeap
bst::TreeMap<Tree>
(对树generic), bst2::TreeMap
(基于不带哨兵根的链式树)avlt::AVLTreeMap<Tree>
(要求Tree: MoveParentBinTreeMut
)st::SplayTree<Tree>
(要求Tree: MoveParentBinTreeMut
)bt::BTreeMap
(有待将VecDeque<T>
优化为[T]
)rbt::RedBackTreeMap<Tree>
(要求Tree: MoveParentBinTreeMut
)llrbt::RedBackTreeMap
(基于bst2::TreeMap
)