在不重复任何组合的情况下迭代未知大小的多维数组的所有组合的最佳方法是什么?


ArrayList<ArrayList<ArrayList<String>>> one = new ArrayList<ArrayList<ArrayList<String>>>();

one看起来像这样,有一些示例值:

[  
    [  
        ["A","B","C",...],
        ["G","E","J",...],  
        ...  
    ],
    [ 
        ["1","2",...],
        ["8","5","12","7",...],  
        ...   
    ],  
    ... 
]

假设总是有一个基本情况,至少有一个字母数组列表(例如["A","B","C"]),但可能有更多(例如["X","Y","Z"]),可能有任何大小的数字数组列表,可能根本没有,但可能有数百个(例如["1","2","3"],…,["997","998","999"])。此外,可以有更多类型的任意大小的数组列表(例如["@","#","$"])。所以唯一确定的是ALWAYS:

one.size()>=1  
one.get(0).size()>=1  
one.get(0).get(0).size()>=1

所以问题是:我如何才能最好地获得每个类别的每个组合,而不知道每个数组列表有多大或有任何重复,但假设one。get(0)。get(0)是有效的?例如:["A","B","C",...] ["1","2",...] ..., ["A","B","C",...] ["8","5","12","7",...] ...。我目前在我的项目中使用Java,但任何算法的工作,我可以转换自己。如果我说得不清楚,我很抱歉,我很难用语言表达出来,这可能是我想不出解决办法的部分原因。

我知道两个解,递归的和非递归的。这里是非递归的(类似于如何获得二维数组可能组合的答案)

1)将每个数组的长度相乘。这是你可以做出的可能组合的数量。称之为totalcombinations

2)创建一个名为counters的int[]数组。它应该和数组的个数一样长,并且都初始化为0。

3a)对于totalcombinations次,将arrays[0]中的counter[0]次,arrays[1]中的counter[1]次…等,并将其添加到所有结果列表中。

3b)则设置j = 0,并增加counters[j]。如果这导致counters[j] > arrays[j].length,那么counters[j] = 0, ++j并增加新的counters[j](例如重复3b)),直到你没有得到这样的溢出。

如果你把counters想象成手提箱的玻璃杯——当你从9溢出第一个数字到0时,下一个数字就会越过——那么你应该在这里得到策略。

相关内容

  • 没有找到相关文章

最新更新