Partitions

A [disjoint-sets/union-find] implementation of a vector partitioned in sets that allows for efficient iteration over the elements of a set.

The main struct of this crate is PartitionVec<T> which has the functionality of a Vec<T> and in addition divides the elements of this vector in sets. The elements each start in their own set and these sets can be joined with the union method. You can check if elements share a set with the same_set method and iterate on the elements in a set with the set method. The union and same_set methods are extremely fast and have an amortized complexity of O(α(n)) where 'α' is the inverse Ackermann function and n is the length. α(n) has value below 5 for any n that can be written in the observable universe. The elements of the iterator returned by set are found in O(1) time.

This can be used for example to keep track of the connected components of an undirected graph. This struct can then be used to determine whether two vertices belong to the same component, or whether adding an edge between them would result in a cycle. The Union–Find algorithm is used in high-performance implementations of unification. It is also a key component in implementing Kruskal's algorithm to find the minimum spanning tree of a graph.

For each element of a PartitionVec<T> we need to store three additional usize values. A more compact implementation is included that has the same functionality but only needs to store an additional two usize values. This is done by using a few bits of these two values to store the third. On 32 bit and 64 bit systems we use 3 bits, this means a PartitionVec<T> can store 536870912 and 2305843009213693952 values respectfully and will panic if we go above this limit. This is 8 times less than the amount of memory addresses but should still be enough for the fast majority of uses. This is a feature and can be enabled by adding the following to your Cargo.toml file: toml [dependencies.partitions] version = "0.1" features = ["compact"]

Using Partitions

The recommended way to use this crate is to add a line into your Cargo.toml such as:

toml [dependencies] partitions = "0.1"

and then add the following to to your lib.rs or main.rs:

rust extern crate partitions;

License

Partitions is distributed under the terms of the Apache License (Version 2.0).