确定多个集合中的唯一值

时间:2015-01-21 08:36:55

标签: c++ set

在这个项目中,有多个sets,其中包含1到9的值。在此期间,我需要有效地确定在一个set中是否存在唯一的值,而不是其他值

例如:

std::set<int> s_1 = { 1, 2, 3, 4, 5 };
std::set<int> s_2 = { 2, 3, 4 };
std::set<int> s_3 = { 2, 3, 4, 6 };

注意: sets之前runtime的数量未知。

如您所见,s_1包含15的唯一值,而s_3包含6的唯一值。

确定唯一值后,上述sets应该只包含这样的唯一值:

// s_1 { 1, 5 }
// s_2 { 2, 3, 4 }
// s_3 { 6 }

我到目前为止所做的是loop通过所有sets并记录已出现的count numbers。但是我想知道那里是否有更有效的解决方案。

3 个答案:

答案 0 :(得分:0)

std C ++库中有std算法,用于2组上的交集,差异和并集操作。

如果我理解你的问题,你可以这样做: 在所有集合(在循环中)做一个交集以确定基数,然后在每个集合和基数之间应用差异? 您可以根据当前实现对此进行基准测试。应该更快。

看看这个答案。

Getting Union, Intersection, or Difference of Sets in C++

编辑:cf Tony D.评论:基本上你可以使用std::bitset<>和二元运算符(&amp; | etc ..)进行相同的操作,这应该更快。 根据您输入的实际大小,可能值得一试。

答案 1 :(得分:0)

我会在c#中建议像这样的东西

Dictionary<int, int> result = new Dictionary<int, int>();
foreach(int i in sets){
   if(!result.containskey(i))
      result.add(i,1);
   else
      result[i].value = result[i].value+1;
}

现在,计数值仅为1的数字表示其唯一,然后找到具有这些数字的集合......

答案 2 :(得分:0)

我建议:

  1. 开始将所有集合中的所有元素插入到多图中。
  2. 此处每个元素都是一个键,而设置名称是值。
  3. 您的多个地图中的所有元素中都包含所有元素, 然后循环throgth multimap并计算每个元素的计数 多重映射。
  4. 如果任何键的计数为1,则表示其唯一值和值 这将是集名。