考虑到其词典索引,我试图找到一种方法来确定一组n个数的n-2个数的排列,允许重复。我们这样做的一个原因是在给定索引的情况下找到Prufer代码。 考虑一组数字为[1,2,3,4],我们得到一组n-2个排列为[1,1],[1,2],[1,3],[1,4]。 ..... [4,3],[4,4]。 我的问题是,如果有一个方法可以获得这样的排列,只需将索引作为输入,而不必枚举所有排列。我查看了此链接Finding the index of a given permutation中的方法,但这可能与n-2个对象的排列有关。感谢你。
答案 0 :(得分:3)
可以通过将等级转换为基数为n的数字,并将其数字解释为基于0的索引来计算具有来自一组n个数的给定等级的排列:
设置:[1,2,3,4]
基于0的排名:9
9在基地-4:21
基于0的索引:[2,1]
排列:[3,2]
设置:[a,b,c,d,e]
基于0的排名:64
64在基地-5:224
0基指数:[2,2,4]
排列:[c,c,e]
这样的事情可以解决问题,其中set
是一个包含n个数字的int数组,而perm
是一个int数组,足以容纳n-2个数字:
void permutation(int *set, int n, int rank, int *perm) {
for (int k = n - 2; k > 0; --k) {
perm[k - 1] = set[rank % n];
rank /= n;
}
}
(上述代码假定有效输入)
答案 1 :(得分:0)
这不是编程问题,而是更多关于理解。 Prufer序列它是一个系列或线性应用程序,用于标记一组数字的每个可能的排列,每个标识都是唯一的;所以,您可以为[a0,a1,a2,...,an-1]定义您的Prufer顺序,例如
S = [a0,a1, ..., an-1], S in N
S -Prufer-> S x S
0 --------> [a0, a0]
1 --------> [a0, a1]
...
n-1 ------> [a0, an-1]
n --------> [a1, a0]
n+1 ------> [a1, a1]
...
2n-1 -----> [a1, an-1]
2n -------> [a2, a0]
2n+1 -----> [a2, a1]
依旧...... 然后,通常,您可以确定索引为i的排列
P(i) = [a_sub_(i/n), a_sub(i modulus n)].
请注意,这个Prufer系列只是一个简单的例子:你可以定义自己的,记住它必须始终识别整个排列集,并使每个标识都是唯一的(即,基本代数中的双向线性应用)
答案 2 :(得分:0)
以下是m69想法的一些JavaScript代码:
function f(rank, arr){
var n = arr.length,
res = new Array(n - 2).fill(arr[0]),
i = n - 3;
while (rank){
res[i--] = arr[rank % n];
rank = Math.floor(rank / n);
}
return res;
}
console.log(f(64, ['a','b','c','d','e']));