示例:我的数字形式为1到10.所有可能的组合,每个组合中的每个变量包含一次而不重复,都是......好吧...... 3628800(10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 3628800)。
在我的情况下,计算机必须检查所有组合,而不是选择随机组合。之后,系统会将所需的组合存储在一个数组中。但我想不出一个算法,我在互联网上找不到一个(可能是因为我没有找到正确的方法)。
我可以使用什么算法混合多个变量,其中所有组合都没有重复变量?
答案 0 :(得分:5)
您可以尝试递归方法。
想法是“猜测”首先是哪个数字,设置它 - 然后递归到数组的剩余部分。如果你对所有剩余的元素进行这些“猜测”,你就可以获得所有可能的排列。
这是一个通用案例C代码,它打印给定数组的所有排列(不处理数组中的重复值):
void permute(int *array,int i,int length) {
if (length == i){
printArray(array,length);
return;
}
int j = i;
for (j = i; j < length; j++) {
swap(array+i,array+j);
permute(array,i+1,length);
swap(array+i,array+j);
}
return;
}
在这种方法中:使用您的数字预先填充数组:1,2,...,n
- 并在其上调用排列算法。
您可以通过一个简单的测试用例来查看它,包括ideone
中的print()
和swap()
函数
答案 1 :(得分:1)
您要找的是排列。
Wikipedia列出了几种不同的方式:
一种天真的慢速方法涉及创建一个赋予整数i的函数,返回第i个排列,然后只调用函数N!次。
看一下这个问题的答案here。
词典编纂方法描述为:
以下算法在给定排列后按字典顺序生成下一个排列。它就地改变了给定的排列。
找到最大的索引k,使得a [k]&lt; a [k + 1]。如果不存在这样的索引,则排列是最后的排列。
找到最大的索引l,使得a [k]&lt;一个[1]。由于k + 1是这样的指数,因此l被很好地定义并且满足k <1。升。
用[l]交换[k]。
- 醇>
将序列从[k + 1]反转到包括最后一个元素a [n]。
您应首先对序列进行排序,以便按顺序排列所有排列。
可能会更快,但我在快速查看时没有看到任何代码示例。
答案 2 :(得分:0)
好像你正试图改变你的整数集:Fisher–Yates shuffle