1 个不稳定版本

0.1.1 2021 年 6 月 20 日

#9 in #iterating

MIT 许可证

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