我是一个向量的向量,每个向量代表一个集合(在数学意义上)。例如:
{{1, 3}, {4, 9, 14}, {1, 3}, {1, 4, 8, 9, 10, 14, 16}, {1, 3, 9}, {4, 9, 17, 22}}
我想制作最有效的C ++可能功能,能够过滤(如果可能的话)传感器,以便删除包含另一个项目的每个项目。
例如,在这里:
{1, 3}
包含在{1, 3}
和{1, 3, 9}
{4, 9, 14}
包含在{1, 4, 8, 9, 10, 14, 16}
结果向量将是:
{{1, 3}, {4, 9, 14}, {4, 9, 17, 22}}
当我开始使用C ++时,实际上并没有任何关于如何有效地做到这一点的线索。我在这里的其他答案中找到了擦除/移除习惯用法,这在这里看起来不太合适,除非通过擦除封闭作为谓词。这在C ++中似乎并不真实。
请注意,保持原始顺序并不重要,每个集合中的值排序也不重要。
答案 0 :(得分:1)
鉴于我到目前为止所学到的,感谢您的非常有用的评论,我提出的解决方案是:
struct std::vector<size_t> colset;
bool less_colsets(const colset& a, const colset& b) {
return a.size() < b.size();
}
void sort_colsets(std::list<colset>& l) {
l.sort(less_colsets);
}
void strip_subsets(std::list<colset>& l) {
sort_colsets(l);
for (std::list<colset>::iterator i = l.begin(); i != l.end(); ++i) {
std::list<colset>::iterator j = next(i, 1);
while (j != l.end()) {
if (includes((*j).begin(), (*j).end(), (*i).begin(), (*i).end())) {
j = l.erase(j);
}
else {
++j;
}
}
}
}
请注意,我将最外面的std::vector
替换为std::list
,这对于任何地方的元素删除都进行了更优化。
这似乎按预期工作,但我需要更多测试来证明这一点。 下一步是使用比 includes
更有效的比较函数,它将考虑每个向量按词汇顺序排列的事实(程序保证)。我明天会试试。
修改:看起来std::includes
已经处理了这个事实。 YAY!
谢谢大家。