Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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
复杂Java置换生成问题_Java_Recursion_Permutation - Fatal编程技术网

复杂Java置换生成问题

复杂Java置换生成问题,java,recursion,permutation,Java,Recursion,Permutation,我正试图找出一种最佳的方法来为一个序列生成所有可能的排列,这个序列是一个固定数量的数字,并且每个数字都有一个不同的字母表 我有许多整数数组,每一个都有不同的长度,当生成排列时,只有数组的值才能占据最终结果的位置 一个具体示例是一个名为conditions的int数组,其中包含以下数据: conditions1 = {1,2,3,4} conditions2 = {1,2,3} conditions3 = {1,2,3} conditions4 = {1,2} conditions5 = {1,2

我正试图找出一种最佳的方法来为一个序列生成所有可能的排列,这个序列是一个固定数量的数字,并且每个数字都有一个不同的字母表

我有许多整数数组,每一个都有不同的长度,当生成排列时,只有数组的值才能占据最终结果的位置

一个具体示例是一个名为conditions的int数组,其中包含以下数据:

conditions1 = {1,2,3,4}
conditions2 = {1,2,3}
conditions3 = {1,2,3}
conditions4 = {1,2}
conditions5 = {1,2} 
我想创建一个5列的表,包含所有可能的排列-这个例子是144(4x3x2x2x2)。列1只能使用条件1中的值,列2只能使用条件2中的值,以此类推

产出将是:

1,1,1,1,1
1,1,1,1,2
1,1,1,2,1
1,1,1,2,2
1,1,2,1,1
.
.
through to 
4,3,3,2,2
我已经很久没有做过这些了,我发现的大部分信息都与所有字段的相同字母表的排列有关。我可以使用它,然后在删除所有具有无效值但听起来效率低下的列的排列后运行测试

我非常感谢您的帮助


Z.

看ma,不需要递归

Iterator<int[]> permutations(final int[]... conditions) {
  int productLengths = 1;
  for (int[] arr : conditions) { productLengths *= arr.length; }
  final int nPermutations = productLengths;
  return new Iterator<int[]>() {
    int index = 0;
    public boolean hasNext() { return index < nPermutations; }
    public int[] next() {
      if (index == nPermutations) { throw new NoSuchElementException(); }
      int[] out = new int[conditions.length];
      for (int i = out.length, x = index; --i >= 0;) {
        int[] arr = conditions[i];
        out[i] = arr[x % arr.length];
        x /= arr.length;
      }
      ++index;
      return out;
    }
    public void remove() { throw new UnsupportedOperationException(); }
  };
}
迭代器置换(最终int[]条件){
int productlength=1;
对于(int[]arr:conditions){productLength*=arr.length;}
最终整数nPermutations=产品长度;
返回新的迭代器(){
int指数=0;
公共布尔hasNext(){返回索引=0;){
int[]arr=条件[i];
out[i]=arr[x%arr.length];
x/=阵列长度;
}
++指数;
返回;
}
public void remove(){抛出新的UnsupportedOperationException();}
};
}

将其包装在一个
Iterable
中将使(…:…)循环更易于使用
。您可以通过取消迭代器接口并将数组作为参数进行填充来摆脱数组分配。

编写一些代码,您将面临问题,然后提出问题-这样不容易吗?我确实编写了一些代码。问题是,当每个条件的长度相同时,代码工作得很好。但是,当我尝试使用上述不同的长度时,它会崩溃。然后显示代码,我们可以帮助您更改它以执行正确的操作。(顺便说一句,排列不是正确的词(因为你不改变顺序)-变异更合适。)谢谢迈克。好多了。这很有效。只是一个简单的问题,你介意解释一下out[i]=arr[x%arr.length]背后的理论吗;和x/=arr.length;行,因为它们是它的精髓。@Zoran,即使它不是一个递归算法,你也可以递归地思考它。如果第一个数组中有n个元素,并且其他数组中有o*p*q排列,那么我可以通过使用余数(
%
)从n个元素中选择一个元素,然后除以以获得用于其余数组的索引来减少问题。