Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 计算数组的重复排列_C_Algorithm - Fatal编程技术网

C 计算数组的重复排列

C 计算数组的重复排列,c,algorithm,C,Algorithm,假设我有一个包含5个元素的数组。如何计算这个数组在C中所有可能的重复排列 编辑:我的意思是使用5个数字创建所有可能的数组。因此,立场很重要 例如: array = [1,2,3,4,5] [1,1,1,1,1] [1,1,1,1,2] [1,1,1,2,3] . . 如果我没有弄错你的问题,你需要用数字1、2、3、4和5生成所有5位数字。因此有一个简单的解决方案-生成所有以5为基数的数字,直到44444,然后将0映射到1,1映射到2,依此类推。在需要的地方添加前导零-使10变为00010或[

假设我有一个包含5个元素的数组。如何计算这个数组在C中所有可能的重复排列

编辑:我的意思是使用5个数字创建所有可能的数组。因此,立场很重要

例如:

array = [1,2,3,4,5]

[1,1,1,1,1]
[1,1,1,1,2]
[1,1,1,2,3]
.
.

如果我没有弄错你的问题,你需要用数字1、2、3、4和5生成所有5位数字。因此有一个简单的解决方案-生成所有以5为基数的数字,直到
44444
,然后将0映射到1,1映射到2,依此类推。在需要的地方添加前导零-使
10
变为
00010
[1,1,1,2,1]


注意:实际上,您没有生成数字本身的能力,您可以将数字迭代到5**5(不包括),并通过以5为底的数字找到每个数字对应的序列。

在给定的示例中,每个位置都可以被
1
2
3
占据,
4
5
。因为有5个位置,所以可能性的总数=
5*5*5*5=5^5=3125
。一般来说,它应该是
N^N
。(其中,^是求幂运算符)

要生成这些可能性,请在每个位置依次输入数字
1
2
3
4
5
,并从最后一个位置开始递增,类似于5位计数器

因此,从
11111
开始。增加最后一个位置以获得
11112
。。。直到
11115

然后返回到
1
,并增加下一个数字
11121
继续执行
11122
11125等。重复此操作直到到达第一个位置,最后到达
55555

生成组合或排列的常用方法是使用递归:枚举第一个元素的每个可能性,并将其预先加在同一集合的每一个组合或排列上,减少一个元素。所以,如果我们说,你在寻找每次取k的n个事物的排列数,我们使用符号perms(n,k),你会得到:

perms(5,5) = {
    [1, perms(5,4)]
    [2, perms(5,4)]
    [3, perms(5,4)]
    [4, perms(5,4)]
    [5, perms(5,4)]
}
同样,对于烫发(5,4),您可以得到:

所以部分烫发(5,5)看起来像:

[1, 1, perms(5,3)]
[1, 2, perms(5,3)]
[1, 3, perms(5,3)]
[1, 4, perms(5,3)]
[1, 5, perms(5,3)]
[2, 1, perms(5,3)]
[2, 2, perms(5,3)]
...
定义perms(n,k)很容易。对于任何递归定义,您需要两件事:基本情况和递归步骤。基本情况是k=0:perms(n,0)是一个空数组[]。对于递归步骤,您可以通过将集合中的每个可能值预先添加到perms(n,k-1)的所有元素来生成元素

使用此函数,您可以从
{0,0,0,0,0}
开始迭代(0…4)的所有重复排列。当函数没有重复排列时,它将返回0


然后依次对每个重复排列使用内容作为数组的索引,以获得数组的重复排列,而不是(0…4)。

[1,1,1,1,1]不是[1,2,3,4,5]的排列。[3,2,5,4,1] is@BlackBear有一个术语
重复排列
[1,1,1,1,1]
是一个有效的重复排列[1,2,3,4,5],你似乎在谈论,而不是,虽然我认为这是一种排列形式,如果你关心顺序和元素的话。OP想要什么有一个公认的术语吗?类似于“所有可能的大小为5的数组,元素来自[1,2,3,4,5],”但更短?@Caleb我认为这里的排列不同于组合,因为
[1,2,1,2,1]
不同于
[1,1,1,2,2]
[1, 1, perms(5,3)]
[1, 2, perms(5,3)]
[1, 3, perms(5,3)]
[1, 4, perms(5,3)]
[1, 5, perms(5,3)]
[2, 1, perms(5,3)]
[2, 2, perms(5,3)]
...
int increment(size_t *dst, size_t len, size_t base) {
    if (len == 0) return 0;
    if (dst[len-1] != base-1) {
        ++dst[len-1];
        return 1;
    } else {
        dst[len-1] = 0;
        return increment(dst, len-1, base);
    }
}