带参数的范围内的所有排列

时间:2018-01-30 19:52:31

标签: algorithm permutation combinatorics

我试图找到有效的算法来解决以下问题。 给出1..N中的一系列数字,以及一些任意数字K和M,找到给定范围内的所有可能的排列。其中K表示元素的数量,M表示元素之间的最小距离。

让我们看看这个例子:

array = 1,2,3,4,5,6,7,8
K = 2
M = 2

所以输出将是

(3,5)
(3,6)
(4,6)

所以你可以看到如果K和M越来越大,复杂性会增加。

干杯。

1 个答案:

答案 0 :(得分:0)

此问题等同于从具有k元素的集合中查找大小为n - (k-1)*(m-1)的子集(组合)。这些数量为(n - (k-1)*(m-1) choose k)

在原始问题中,当选择第一个元素时,例如2,因为距离限制而不能成为结果集的一部分,而不是m-1个元素。这适用于除最大结果之外的所有结果元素。

因此,对于n - (k-1)*(m-1)的组合,(c_0, c_1, ..., c_{k-1})原始问题中的相应组合为(c_i + i*(k-1), i=0, ..., k-1)