有没有一个函数像next_placement,但对于具有重复的排列

Is there a function like next_permutation but for permutations with repetition?

本文关键字:于具 排列 placement 有一个 函数 next      更新时间:2023-10-16

我想做的是找到一个一维数组的每个内容重复的排列。

例如

int array[]={1,2,3};
for(i=0;i<3;i++){
    next_permutation(array,array+3)
    for(int j=0;j<=3;j++){
        printf("%d ",array[j]);
    }
printf("n");
}

将返回:

1 2 3
1 3 2
2 1 3
etc...

我希望函数返回的内容:

1 1 1
1 1 2
1 2 1
2 1 1
1 2 2
2 2 1
2 1 2
1 1 3
1 3 1
3 1 1
etc...

有什么函数可以做到这一点吗?

提前感谢,Erik

您不是在进行排列,而是在计数。

Ex。如果您的枚举集{0,1}超过3位,您将得到:

000
001
010
011
100
101
110
111

看,这只是二进制计数。

因此,将元素集映射为n位数字,然后进行基于n的计数将为您提供正确的awnser

我用Java编写了这篇文章
未优化的代码,但你明白了:

String [] data = {"1","2","3"};
public void perm(int maxLength, StringBuffer crtComb){
    if (crtComb.length() == maxLength){
        System.out.println(crtComb.toString());
        return;
    }
    for (int i=0; i<data.length; i++){
        crtComb.append(data[i]);
        perm(maxLength, crtComb);
        crtComb.setLength(crtComb.length()-1);
    }
}

通常计算从1到k的整数排列(带重复)时:

  1. 最初将第一个排列设置为1 1 1。。。。(k次)。

  2. 找到最右边的索引(比如j),使得该索引处的元素小于k。

  3. 将索引j处元素的值增加一,从位置j+1到k,将所有元素重置为1。

  4. 重复步骤2和3。

应用这个逻辑,我们现在得到:

第一次排列->1 1 1。

然后在位置2(0索引计数),我们有1<3,因此将其递增,并在此之后将所有元素重置为1。第二次排列->1 1 2。

然后在位置1(0索引计数),我们有1<3,因此将其递增,并在此之后将所有元素重置为1。第三次排列->1 2 1

等等。