【问题标题】:Complex Java Permutation Generation Problem复杂的 Java 排列生成问题
【发布时间】:2011-04-02 13:43:20
【问题描述】:

我正在尝试找出最好的方法来为一个序列生成所有可能的排列,这个序列是一个固定的数字,每个数字都有不同的字母表。

我有许多整数数组,每个数组可以有不同的长度,在生成排列时,只有数组的值可以占据最终结果中的位置。

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

conditions1 = {1,2,3,4}
conditions2 = {1,2,3}
conditions3 = {1,2,3}
conditions4 = {1,2}
conditions5 = {1,2} 

我想创建一个包含所有可能排列的 5 列表 - 本例为 144 (4x3x3x2x2)。第 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.

【问题讨论】:

  • 写一些代码,你会遇到问题,然后提出问题——这样不是更容易吗?
  • 我确实写了一些代码。问题是当每个条件长度相同时,代码运行良好。但是当我尝试上述不同的长度时,它就会崩溃。
  • 然后显示代码,我们可以帮助您更改它以做正确的事情。 (顺便说一句,permutations 不是正确的词(因为您不更改顺序)- variation 会更合适。)

标签: java recursion permutation


【解决方案1】:

看,不需要递归。

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(); }
  };
}

将其包装在Iterable&lt;int[]&gt; 中将使其更易于与for (... : ...) 循环一起使用。您可以通过取消迭代器接口并仅将要填充的数组作为参数来摆脱数组分配。

【讨论】:

  • 谢谢迈克。好多了。这很好用。只是一个简单的问题,你介意解释一下 out[i] = arr[x % arr.length]; 背后的理论吗?和 x /= arr.length;线条,因为它们几乎是它的核心。
  • @Zoran,即使它不是递归算法,你也可以递归地考虑它。如果我在第一个数组中有 n 个元素,并且来自其余数组的 o * p * q 排列,那么我可以通过使用余数 (%) 选择一个 n 来减少问题,然后除以得到一个与剩余数组一起使用的索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2013-09-08
相关资源
最近更新 更多