1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//! **outils** is a graph and tree data structure library. It provides utilities which at the
//! time of writing were not available through other crates.
//!
//! As of this version of **outils**, those utilities are:
//!
//! **Fully dynamic connectivity** for general graphs: A dynamic graph data structure is able to
//! answer queries as to whether two vertices are connected in a graph through a path of edges.
//! In this context, _fully dynamic_ means that the graph can be updated by insertions or
//! deletions of edges between queries (see also [Dynamic Connectivity][1]).
//!
//! - [`DynamicGraph`][2]: Deterministic dynamic connectivity with query cost **O(log(n))** and
//! update costs of **O(log^2 (n))**. The structure also supports vertex weights, dynamically
//! maintaining the total weight of connected components.
//!
//! **Balanced binary search trees**: A [balanced binary search tree][3] organizes search keys and
//! their associated payload in a way such that the resulting binary tree has a minimal height,
//! given the number of items stored, resulting in query and update costs of O(log(n)). This library
//! uses [AA trees][4], an abstraction of red-black trees, for balancing the trees after updates.
//!
//!  - [`AaTree`][5]: An iterative AA tree implementation using [arena allocation][6]. For most use
//! cases, it is recommended to simply use the [`BTreeMap`][7] provided by the standard library, as
//! it is considerably faster (appr. 50%). However, if information on parent and child relations
//! between tree nodes, or custom traversal of the tree as such, are needed, `AaTree` has an advantage
//! over `BTreeMap`.
//!
//!  - [`WeightedAaTree`][8]: This is similar to `AaTree`. However, in addition to the actual
//! payload, node weights can be stored and tree subweights are maintained.
//!
//! **Balanced binary forests**: A balanced binary forest is a forest of [balanced binary trees][3].
//! In contrast to the tree data structures above, the order of the payload is not determined by
//! associated search keys but by the relations of the nodes to each other: the in-order traversal
//! of a forest tree alone represents the order of its nodes. Forest trees can be concatenated or
//! split in order to manage those sequences. Parent and child relations are available, facilitating
//! analysis of the represented sequences.
//!
//!  - [`AaForest`][9]: A forest of trees balanced by the [AA tree][4] algorithm. Concatenation and
//! separation do not require a reorganisation of the tree according to search keys - only
//! rebalancing will take place, the order of the sequence being the responsibility of the user.
//! The implementation is based on [arena allocation][6], and tree queries and updates are conducted
//! iteratively, as in the corresponding AA tree structures above.
//!
//!  - [`WeightedAaForest`][10]: This is similar to `AaForest`. However, in addition to the actual
//! payload, a node weight can be stored and tree subweights are maintained.
//!
//! **General purpose tree data structures**:
//!
//! - [`Forest`][11]: A generic forest of trees. The implementation is based on
//! [arena allocation][6] and a [first child/next sibling][12] representation, thus storing the
//! children of a node as a linked list headed by the first child of the parent node.
//!
//! [1]: https://en.wikipedia.org/wiki/Dynamic_connectivity
//! [2]: ./graph/dynconn/hdt/struct.DynamicGraph.html
//! [3]: https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree
//! [4]: https://en.wikipedia.org/wiki/AA_tree
//! [5]: ./tree/bst/aatree/struct.AaTree.html
//! [6]: https://en.wikipedia.org/wiki/Region-based_memory_management
//! [7]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html
//! [8]: ./tree/bst/waatree/struct.WeightedAaTree.html
//! [9]: ./tree/bst/aaforest/struct.AaForest.html
//! [10]: ./tree/bst/waaforest/struct.WeightedAaForest.html
//! [11]: ./tree/generic/struct.Forest.html
//! [12]: https://en.wikipedia.org/wiki/Left-child_right-sibling_binary_tree

#![warn(missing_docs)]

extern crate core;
extern crate rand;
extern crate slab;

pub mod graph;
pub mod prelude;
pub mod tree;
pub mod types;