0.1.1 2021年6月19日
0.1.0 2021年6月19日
0.0.1 2021年6月17日

#22 in #iterating

MIT 许可证

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