在给出词典索引

时间:2017-03-24 19:03:46

标签: c algorithm permutation

考虑到其词典索引,我试图找到一种方法来确定一组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个对象的排列有关。感谢你。

3 个答案:

答案 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']));