我想知道什么是最有效的方法。
我有两个地方收集的要点。
我只对两地共有的几点感兴趣。
我的计划是有3 std::set<Point>。首先,我会把区域A中的点加到集合A中,然后把B点加到集合B中,并让集合C是两个集合的交集。
然而,我想知道是否有一种更好的方法,可能涉及较少的集合?
谢谢
发布于 2014-01-07 19:23:11
您的问题非常常见,甚至有一个(以明显的方式命名) set_intersection()供您使用。
发布于 2014-01-07 19:20:43
你可以取消集合B:首先从A收集点到集A,然后从B收集点,但只有当它们也存在于A中时,才能将它们放在C中。
如果集合A和B是不同(和可预测的)大小,显然的选择是消除较大的。
发布于 2014-01-07 19:22:25
基于朴素集的方法(构建两个集合,然后生成交集)有以下步骤:
std::set A。假设源1有N个点,这是:
std::set B。
std::set_intersection
稍微改进的基于集合的方法是:
std::set A(与上面相同的复杂性)- 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以获得最佳性能。如果源按排序顺序提供点数,则可以完全避免设置,并节省更多的空间和时间。
https://stackoverflow.com/questions/20979892
复制相似问题