1 个不稳定版本
0.1.1 | 2021 年 6 月 20 日 |
---|
#9 in #iterating
26KB
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