如何优化标准::设置交集算法(C++)
How to optimize a std::set intersection algorithm (C++)
我正在为我的大学作业的一部分而苦苦挣扎。我有两个 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
有方法find
和count
O(log(n))
(它们执行二叉搜索)。
因此,您可以简单地执行以下操作:
for (const auto& e : subset1) {
if (subset2.count(e) != 0) {
result.insert(e);
}
}
这具有n*log(m)
的复杂性,而不是您的n * m
.
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何在 Mac 上使用 c++17 并行标准库算法?