Crates.io | permutation-generator-rs |
lib.rs | permutation-generator-rs |
version | 0.1.1 |
source | src |
created_at | 2021-06-17 19:17:43.833283 |
updated_at | 2021-06-19 12:36:13.449631 |
description | A direct permutation generator |
homepage | https://github.com/thomvil/permutation-generator-rs |
repository | https://github.com/thomvil/permutation-generator-rs |
max_upload_size | |
id | 411509 |
size | 23,589 |
Generates the basic permutations of n
elements and length n
in a direct fashion. It works index-based, not by iterating over previous permutations.
Currently only available on nightly
, because it relies on #![feature(min_type_alias_impl_trait)]
.
Optimized versions:
PermutationGenerator8
: for basic permutations upto 8 elementsPermutationGenerator16
: for basic permutations upto 16 elementsPermutationGenerator32
: for basic permutations upto 32 elementsPermutations of more than 32 elements are not provided, since the index of permutation cannot be represented by a single u128
.
PermutationGenerator
s implement Iterator<Item = impl Iterator<Item = u8>>
.
Iterate over the permutations of 4 elements
let mut pg = PermutationGenerator8::new(4).unwrap();
assert_eq!(&[0, 1, 2, 3], pg.next().unwrap().collect::<Vec<_>>().as_slice());
If the specified size of the permutations exceeds the capacity of the used PermutationGenerator
, and Err(PermutationError)
is returned.
let pg = PermutationGenerator8::new(14);
assert_eq!(PermutationGeneratorError::TooManyElements, pg.unwrap_err());
If only a single permutation is needed for a known idx
let mut pg = PermutationGenerator8::new(4).unwrap();
assert_eq!(&[0, 1, 2, 3], pg.next().unwrap().collect::<Vec<_>>().as_slice());
let last_perm_iter = PermutationGenerator8::nth_absolute(4, 4*3*2*1 - 1).unwrap();
assert_eq!(&[3, 2, 1, 0], last_perm_iter.collect::<Vec<_>>().as_slice()));
The number of permutations of size larger than 20, cannot be represented by u128
. Collecting all, or querying the count
, will panic.
let pg = PermutationGenerator32::new(30);
pg.count() // -> panics!