2011-04-02 60 views
2

我试图找出产生的序列是数字固定编号和每一个数字都有不同的字母所有可能的排列的最好方式。复杂的Java排列生成问题

我有许多整数数组,并且每一个都可以具有不同的长度并产生置换当只有数组的值可以占据在最终结果中的排名。

一个具体实例是所谓的条件与下列数据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和conditions2列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.

+2

写一些代码,你将面临的问题,然后提出问题 - 是不是很容易呀? – Nishan 2011-04-02 13:48:15

+0

我确实写了一些代码。问题是当每个条件的长度相同时,代码运行良好。但是当我尝试不同的长度时,它会崩溃。 – Zoran 2011-04-02 15:52:36

+0

然后显示代码,我们可以帮助你改变它做正确的事情。 (顺便说一下,*排列*不正确的话(因为你不改变顺序) - *变化*会更适合。) – 2011-04-02 16:34:14

回答

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<int[]>结束语将使其更容易与for (... : ...)循环使用。你可以通过取消迭代器接口来取消数组分配,只需将数组作为参数来填充即可。

+0

感谢麦克。好多了。这很好。只是一个简单的问题,你介意解释out [i] = arr [x%arr.length]的原理吗?和x/= arr.length;因为它们几乎是它的胆量。 – Zoran 2011-04-02 17:13:57

+0

@Zoran,即使它不是一个递归算法,你可以递归地思考它。如果我有从阵列的其余部分的第一阵列中n个元素,且o * P * Q置换,然后我可以通过挑选使用余量('%')的n的一个,然后将得到的减少的问题索引与其余数组一起使用。 – 2011-04-02 17:20:25