0.1.1 |
|
---|---|
0.1.0 |
|
0.0.1 |
|
#22 in #iterating
24KB
627 行
排列生成器
以直接方式生成 n 个元素的 n 长度基本排列。它基于索引,而不是通过迭代前一个排列。
目前仅在 nightly
上可用,因为它依赖于 #![feature(min_type_alias_impl_trait)]
。
优化版本
PermutationGenerator8
:用于最多 8 个元素的基本排列PermutationGenerator16
:用于最多 16 个元素的基本排列PermutationGenerator32
:用于最多 32 个元素的基本排列
超过 32 个元素的排列没有提供,因为排列的索引不能由单个 u128
表示。
PermutationGenerator
实现了 Iterator<Item = impl Iterator<Item = u8>>
。
使用方法
遍历 4 个元素的排列
let mut pg = PermutationGenerator8::new(4).unwrap();
assert_eq!(&[0, 1, 2, 3], pg.next().unwrap().collect::<Vec<_>>().as_slice());
如果指定的排列大小超过了使用的 PermutationGenerator
的容量,则返回 Err(PermutationError)
。
let pg = PermutationGenerator8::new(14);
assert_eq!(PermutationGeneratorError::TooManyElements, pg.unwrap_err());
如果只需要已知 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()));
恐慌
大于 20 的大小的排列数量不能用 u128
表示。收集所有内容或查询 count
将导致恐慌。
let pg = PermutationGenerator32::new(30);
pg.count() // -> panics!
依赖关系
~16KB