关于迭代数组数组的算法

时间:2011-07-21 21:00:37

标签: algorithm permutation

n个数组a_0, ..., a_n-1,每个l个元素。如何编写有效的代码来迭代所有组合,其中每个元素都是从不同的数组中挑选出来的。例如,如果两个数组是[0,1]和[3,4],那么输出应该是

[0, 3]
[0, 4]
[1, 3]
[1, 4]

2 个答案:

答案 0 :(得分:3)

在理想的数学环境中,没有比O(l ^ n)更好的算法,无论如何,你将产生l ^ n个元素的输出。

如果你给我们编程语言或架构这样的上下文,我们可以想到最接近O(l ^ n)的算法。

答案 1 :(得分:1)

你可以做得比O(l^n)做得更好,因为夜间工作者正确地指出了这一点。这是解决问题的一种方法。

制作一个大数组A,其i条目是数组a_i,即

A[i] = a_i

现在遍历字母n上所有长度为{0,1,...,l}的单词:

-(array*)nextWord:(array*)word {
    array *newWord = word;
    for (int i=n-1; i=>0; ++i) {
        if (word[i] < l) {
            newWord[i] = word[i]+1;
            for (int j=i+1; j<n; ++j) {
                newWord[i] = 0;
            }
            return newWord;
        }
    }
    return NULL;
}

最后,根据单词

选择条目
word = [0, 0, ... , 0];
while (word != NULL) {
    A[0][word[0]], A[1][word[1]], ... , A[n-1][word[n-1]];
    word = nextWord(word);
}

对于伪代码的不一致感到抱歉,但希望你能在这里辨别逻辑。


顺便提一下,基于问题中的示例,我假设第一个条目应该来自第一个数组,第二个条目来自第二个数组,依此类推。如果不是这种情况,那么您仍然可以使用上述想法,然后置换条目。但是,当且仅当两个阵列具有公共条目时,这样做可能导致重复。