是否有像next_permutation这样的函数,但是对于重复的排列?

时间:2012-03-24 18:02:10

标签: c++ arrays permutation combinations repeat

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

e.g。

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...

是否有能够做到这一点的功能?

提前致谢,      埃里克

3 个答案:

答案 0 :(得分:6)

你不是在进行排列而只是计算。

实施例。如果你的枚举集{0,1}超过3位数,你将获得:

000
001
010
011
100
101
110
111

看,这只是二进制计数。

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

答案 1 :(得分:0)

我用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);
    }

}

答案 2 :(得分:0)

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

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

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

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

  4. 重复步骤2和3。

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

    第1次排列 - &gt; 1 1 1。

    然后在位置2(0指数计数),我们得到1&lt; 3,所以递增它并将此后的所有元素重置为1.第二排列 - &gt; 1 1 2。

    然后在位置1(0指数计数),我们得到1&lt; 3,所以递增它并将此后的所有元素重置为1.第三排列 - &gt; 1 2 1

    等等。