This repository presents Rust implementation of common algorithms and data structures, most of which are based on William Fiset's Java implementation: https://github.com/williamfiset/Algorithms . I highly recommend his YouTube channel, where he explains many of these algorithms in detail using illustrations, animations and pseudocode.
In addition to re-implementing W. Fiset's algorithms, I also add original content that might be helpful, such as solutions of classical puzzles e.g. N-Queens and Sudoku.
The implementation details are explained in comments and docs and the example usage is implied in unit tests. To run tests:
cargo test
These algorithms and data structures are not designed for production usage, but might be directly applicable in competitve programming.
This simple setup provides most features a decent IDE would provide (importantly, jump to definition and type labelling)
This is not a verbatim translation of W. Fiset's Java implementation. Instead, I try to make the code idiomatic in Rust, according to these rules:
mod
sFor example, perfer
crate::algo::graph::bfs::adjacency_list_iterative::fast_deque
over
com.williamfiset.algorithms.graphtheory.BreadthFirstSearchAdjacencyListIterativeFastQueue
Follow the conventions of std
types as much as possible.
For example, when implementing a Queue
, prefer
rust
pub fn push_back(&mut self, value: T);
pub fn pop_front(&mut self) -> Option<T>;
over
rust
pub fn enqueue(&mut self, value: T);
pub fn dequeue(&mut self) -> T;
// or
pub fn offer(&mut self, value: T);
pub fn poll(&mut self) -> T;
Option<T>
to Represent Nullable ValuesGenrerally, Option::None
is an idiomatic representation of null
. This makes the code work better with the standard library and cause less surprises.