C 计算数组的重复排列
假设我有一个包含5个元素的数组。如何计算这个数组在C中所有可能的重复排列 编辑:我的意思是使用5个数字创建所有可能的数组。因此,立场很重要 例如: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或[
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);
}
}