混合多个变量的算法

时间:2012-07-18 12:32:07

标签: algorithm variables language-agnostic combinations

示例:我的数字形式为1到10.所有可能的组合,每个组合中的每个变量包含一次而不重复,都是......好吧...... 3628800(10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 3628800)。

在我的情况下,计算机必须检查所有组合,而不是选择随机组合。之后,系统会将所需的组合存储在一个数组中。但我想不出一个算法,我在互联网上找不到一个(可能是因为我没有找到正确的方法)。

我可以使用什么算法混合多个变量,其中所有组合都没有重复变量?

3 个答案:

答案 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

按顺序

词典编纂方法描述为:

  

以下算法在给定排列后按字典顺序生成下一个排列。它就地改变了给定的排列。

     
      
  1. 找到最大的索引k,使得a [k]&lt; a [k + 1]。如果不存在这样的索引,则排列是最后的排列。

  2.   
  3. 找到最大的索引l,使得a [k]&lt;一个[1]。由于k + 1是这样的指数,因此l被很好地定义并且满足k <1。升。

  4.   
  5. 用[l]交换[k]。

  6.   
  7. 将序列从[k + 1]反转到包括最后一个元素a [n]。

  8.   

您应首先对序列进行排序,以便按顺序排列所有排列。

最小-交换来实现

可能会更快,但我在快速查看时没有看到任何代码示例。

考虑Steinhaus-Johnson-Trotter algorithm的描述。

答案 2 :(得分:0)

好像你正试图改变你的整数集:Fisher–Yates shuffle