首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集的有效相交?

集的有效相交?
EN

Stack Overflow用户
提问于 2014-01-07 19:15:37
回答 7查看 259关注 0票数 0

我想知道什么是最有效的方法。

我有两个地方收集的要点。

我只对两地共有的几点感兴趣。

我的计划是有3 std::set<Point>。首先,我会把区域A中的点加到集合A中,然后把B点加到集合B中,并让集合C是两个集合的交集。

然而,我想知道是否有一种更好的方法,可能涉及较少的集合?

谢谢

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-01-07 19:23:11

您的问题非常常见,甚至有一个(以明显的方式命名) set_intersection()供您使用。

票数 4
EN

Stack Overflow用户

发布于 2014-01-07 19:20:43

你可以取消集合B:首先从A收集点到集A,然后从B收集点,但只有当它们也存在于A中时,才能将它们放在C中。

如果集合A和B是不同(和可预测的)大小,显然的选择是消除较大的。

票数 1
EN

Stack Overflow用户

发布于 2014-01-07 19:22:25

基于朴素集的方法(构建两个集合,然后生成交集)有以下步骤:

  1. 从源1构建std::set A。假设源1有N个点,这是:
    • O(N log N)时间,O(N)空间

  1. 从源代码2构建std::set B
  2. O(M log M)时间,O(M)空间

  1. std::set_intersection
    • O(M+N)时间和空间

稍微改进的基于集合的方法是:

  1. 从第一个源构建std::set A(与上面相同的复杂性)
  2. 对于第二个源中的每个点,将其添加到结果的当且仅当它在集合A中
代码语言:javascript
复制
- O(M log N) time, linear space
- so, you avoided O(M) extra space allocated, and the extra O(M+N) intersection step.

您可以使用std::set实现这一点,如下所示:

如果(a.find(点) != a.end()) result.insert(点);

请注意,如果您知道哪个点源将提供较少的点数,则应该使用该源来构建集A以获得最佳性能。如果源按排序顺序提供点数,则可以完全避免设置,并节省更多的空间和时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20979892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档