Crates.io | sparseset |
lib.rs | sparseset |
version | 1.0.1 |
source | src |
created_at | 2015-05-18 11:27:58.679271 |
updated_at | 2022-04-16 01:58:38.531899 |
description | A Sparse Set |
homepage | |
repository | https://github.com/bombela/sparseset |
max_upload_size | |
id | 2141 |
size | 15,116 |
A Sparse Set implemention in rust.
A sparse set is a specialized data structure for representing a set of integers. It can be useful in some very narrow and specific cases, namely when the universe of possible values is very large but used very sparingly and the set is iterated often or cleared often.
In this implementation the SparseSet can hold an arbitrary value for every integer (key) in the set.
[dependencies]
sparseset = "1.0.1"
use sparseset::SparseSet;
let mut set = SparseSet::with_capacity(128);
set.insert(42, 3);
set.insert(77, 5);
set.insert(23, 8);
assert_eq!(*set.get(42).unwrap(), 3);
set.remove(42);
assert!(!set.get(42).is_some());
for entry in set {
println!("- {} => {}", entry.key(), entry.value);
}
Note that SparseSet is incredibly inefficient in terms of space. The O(1) insertion time assumes space for the element is already allocated. Otherwise, a large key may require a massive reallocation, with no direct relation to the number of elements in the collection. SparseSet should only be seriously considered for small keys.
See how the runtime complexity of SparseSet compares to Hash and Btree maps:
get | insert | remove | iterate | clear | |
---|---|---|---|---|---|
SparseSet | O(1) | O(1)* | O(1) | O(n) | O(1) / O(n)* |
HashMap | O(1)~ | O(1)~* | O(1)~ | N/A | N/A |
BTreeMap | O(log n) | O(log n) | O(log n) | N/A | N/A |
See http://research.swtch.com/sparse for more details.