如何优化标准::设置交集算法(C++)

How to optimize a std::set intersection algorithm (C++)

本文关键字:算法 C++ 设置 标准 何优化 优化      更新时间:2023-10-16

我正在为我的大学作业的一部分而苦苦挣扎。我有两个 std::set 容器的子集,其中包含指向相当复杂对象的指针,但按不同的标准排序(这就是为什么我不能使用std::set_intersection()的原因)。我需要尽快找到两个子集中包含的元素。作业有时间/复杂性要求。

我可以通过执行以下操作n*log(m)其中n是第一个子集的大小,m是第二个子集的大小:

for(auto it = subset1.begin(), it != subset1.end(), it++){
if(find(subset2.begin(), subset2.end(), *it))
result.insert(*it);
}

这不符合时间要求,即最坏情况线性,但平均值优于线性。

我在这里发现了以下问题,我发现哈希表方法很有趣。但是,我担心创建哈希表可能会产生太多开销。集合中包含的类如下所示:

class containedInSets {
//methods
private: 
vector<string> member1;
SomeObject member2;
int member3;
}

我无法控制 SomeObject 类,因此无法为其指定哈希函数。我必须散列指针。此外,向量可能会增长相当(在数千个条目中)。

最快的方法是什么?

你的代码不是O(n log(m))而是O(n * m)

std::find(subset2.begin(), subset2.end(), *it)是线性的,但std::set有方法findcountO(log(n))(它们执行二叉搜索)。

因此,您可以简单地执行以下操作:

for (const auto& e : subset1) {
if (subset2.count(e) != 0) {
result.insert(e);
}
}

这具有n*log(m)的复杂性,而不是您的n * m.