Set_union / Set_intersect用于c ++中的两个以上的集合

时间:2010-10-16 11:26:27

标签: c++ algorithm set intersection

我知道这些命令是两套的。

对于超过两组的设置,是否有任何简单快捷的方法。

我想我可以使用某种循环,但也许有更好的方法。

谢谢

3 个答案:

答案 0 :(得分:1)

关于 set_union
如果你的容器真的是std :: set,你可以循环遍历所有集合,但不能使用set_union,你可以选择其中一个集合并使用insert(使用其他集合的begin()和end()迭代器)。这样,您将创建多个副本,因为set_union返回(迭代器)新创建的集合的副本。如果您不想修改任何一组,可以创建一个新组,一个空组,然后开始插入所有组中的所有元素。
如果你没有使用集合,你可以临时创建一个std :: set,使用insert然后将所有元素插入到你的类型的新容器中。
关于 set_intersect :您可以使用erase,但不能使用迭代器,只需遍历所有集合以及它们包含的所有元素。但我不确定使用set_intersect是否会更快。取决于你有多少套 希望有所帮助(:

答案 1 :(得分:1)

如果您正在使用有序集(如STL集),您可以在一次通过中同时对所有这些集进行联合/交集。如果它们是普通的,我认为你不能比一次组合它们做得更好。

答案 2 :(得分:1)

对于集合联合,如果您要查看哪些M集具有将进行M-1比较的最小值。所以现在我们弹出这个值然后再去。如果N是所有集合中的项目总数,我们的算法就是O(NM)(忽略它是M-1的Big-O表示法)。

我们可以优化的地方如下:如果我们对每组中的最低元素进行排序:现在我们从前面弹出一个元素,但是从那个集合中我们只需要在我们的新排序前面插入O(logM) 。我们为每个项目执行此操作,因此我们的算法为O(N logM)。

请注意,如果你有3,你可能什么也得不到。如果你有8个这样的套装肯定会有收益。

对于集合交集,我们只查找出现在所有集合中的值。如果最小值与最大值相同,我们知道它们都是相同的。我们可以弹出并丢弃较小的值,如果它们不是那么每次再次插入下一个值。如果是这样,我们添加到我们的结果然后从每个列表弹出。无论哪种方式,我们仍然会有O(N logM)