有n
个数组a_0, ..., a_n-1
,每个l
个元素。如何编写有效的代码来迭代所有组合,其中每个元素都是从不同的数组中挑选出来的。例如,如果两个数组是[0,1]和[3,4],那么输出应该是
[0, 3]
[0, 4]
[1, 3]
[1, 4]
答案 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);
}
对于伪代码的不一致感到抱歉,但希望你能在这里辨别逻辑。
顺便提一下,基于问题中的示例,我假设第一个条目应该来自第一个数组,第二个条目来自第二个数组,依此类推。如果不是这种情况,那么您仍然可以使用上述想法,然后置换条目。但是,当且仅当两个阵列具有公共条目时,这样做可能导致重复。