我有n个带有项目的inputLists。 现在我想计算包含原始inputLists中所有项目组合的resultLists(长度为n)(获取每个inputList的一个项目)。
我想我应该在这里提供一个例子(n = 3):
inputList1: [item1, item2, item3]
inputList2: [item4]
inputList3: [item5, item6]
resultList1: [item1, item4, item5]
resultList2: [item1, item4, item6]
resultList3: [item2, item4, item5]
resultList4: [item2, item4, item6]
resultList5: [item3, item4, item5]
resultList6: [item3, item4, item6]
我感觉有点愚蠢,但我不知道如何实现(C ++)为任何n和任何inputList长度创建这些结果的函数。我想我应该使用某种递归,但我不知道如何。
有什么想法吗?
答案 0 :(得分:1)
一般概念,伪代码:
vector<item> List1, List2, List3;
// fill the lists
vector<item> v;
vector<vector<item>> results;
for each item i in List1
{
v.push_back(i)
for each item j in List2
{
v.push_back(j);
for each item k in List3
{
v.push_back(k);
results.push_back(v);
v.pop_back();
}
v.pop_back();
}
v.pop_back();
}
要对可变数量的列表执行此操作,我将使用递归方法。然后,每个for循环将被递归函数调用替换。此函数需要接受您的inputList
列表,结果列表以及存储中间结果(上例中为v
)的容器作为参数。
希望有所帮助。
答案 1 :(得分:0)
迭代器是你的朋友。两个伪代码版本没有打扰错误检查或角落情况,如零大小的列表或类似:
struct cartesian_product_iterator {
int indexes[n] initialized to zeroes
operator++() {
a = 0
indexes[a]++;
while a < n and indexes[a] >= list[a].size()
indexes[a] = 0
a++;
}
operator *() {
list<?> ret;
for a in 0..n-1:
ret.push_back(list[a][indexes[a]]);
return ret;
}
past_the_end_iterator() { indexes[n-1] = list[n-1].size(); }
}
您可能会注意到indexes
数组只是将整数分解为多个基数。这导致了第二个解决方案:
struct cartesian_product_iterator_2 {
unsigned_or_arbitrarly_big_int a_large_number = 0;
operator ++() { a_large_number++; }
operator *() {
list<?> ret;
unsigned_or_arbitrarly_big_int to_decompose = a_large_number;
for a in 0..n-1:
index = to_decompose % list[a].size();
to_decompose /= list[a].size();
ret.push_back(list[a][index]);
}
return ret;
}
past_the_end_iterator() {
a_large_number = 1;
for each l in list:
a_large_number *= l.size();
}
}
至于哪一个最好/更快,我真的不知道。