【发布时间】:2020-05-13 08:10:29
【问题描述】:
给定一个值列表,例如vec![0, 0, 1, 2],我想创建一个迭代器来生成其所有唯一排列。也就是说,
[0, 0, 1, 2]
[0, 0, 2, 1]
[0, 1, 0, 2]
[0, 1, 2, 0]
[0, 2, 0, 1]
[0, 2, 1, 0]
[1, 0, 0, 2]
[1, 0, 2, 0]
[1, 2, 0, 0]
[2, 0, 0, 1]
[2, 0, 1, 0]
[2, 1, 0, 0]
(请注意,有 12 种不同的排列,而如果我们有 4 个 distinct 元素,则将有 24 种不同的排列)。
已经有一种方法可以使用itertools package 生成排列(以及其他迭代器,如组合或没有替换的组合),但对于排列,没有办法将排列限制为唯一的排列。
有一种相当有效的算法来生成排列,通常称为Heap's Algorithm,但是这没有考虑值的相等性/重复性。
这个问题在带有生成器的语言中实现起来并不太棘手,such as Python,但我觉得这在 Rust 中更棘手(至少与上面的解决方案相比),因为它需要使用迭代器(必须维护内部状态),或使用生成器(当前为unstable)。
【问题讨论】:
-
您的输入值列表是否始终排序?
-
不,在这种情况下,输入列表中元素的顺序是任意的(因为两者将具有相同的排列集)。
标签: algorithm rust permutation heaps-algorithm