查找列表项的组合
find combinatios of list items
我有n个带有项目的输入列表。现在我想计算包含原始输入列表中所有项目组合的结果列表(长度为 n)(每个输入列表的一个项目)。
我想我应该在这里提供一个例子(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 长度创建这些结果。我想我应该使用某种递归,但我不知道怎么做。
有什么想法吗?
伪
代码的一般想法:
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
在上面示例中)作为参数的容器。
希望有帮助。
迭代器是你的朋友。 两个伪代码版本,无需担心错误检查或极端情况,如零大小列表等:
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();
}
}
至于哪一个最好/更快,我真的不知道。
相关文章:
- 测试两个类型列表中的所有组合
- 动态填充的组合框不显示文本,列表未定义
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 可视化 如何将 CString 值列表添加到 MFC C++ 中的组合框中?
- 在 MFC 组合框中设置文本,而不将其添加到列表中
- C++ 有没有办法以相同的效率组合此列表和映射
- 快速的唯一组合(来自重复项列表),无需查找
- 组合的实现 - 避免初始值设定项列表
- 如何使用超载 运算符组合两个链接列表
- 如何在列表中获取元素的所有组合
- 使用两个列表中的组合生成函数调用
- 从给定的 IPv6:端口列表中搜索 IPv6:端口组合的最快搜索算法是什么 O(1) 时间一致性
- 如何有效地将数字矢量列表组合到一个大数字向量中
- 在列表中对对象进行排序并组合值
- MFC 组合框下拉列表:仅显示一个项目
- 项目列表中的组合
- MFC组合框,灼热字体列表
- 在自定义组合框下拉列表控件上等待超过5秒会导致win32 C++应用程序在Windows7中挂起
- 组合可选宏以形成列表
- 在C++中生成组合列表的最简单方法是什么?