【问题标题】:C++set intersection and union using arraysC++ 使用数组设置交集和并集
【发布时间】:2014-03-27 22:07:35
【问题描述】:

我必须从数据文件中找到集合并集和集合交集的基数。我创建了两个数组(setA[] 和 setB[])来存储我的数据。 a 和 b 分别是集合 A 和集合 B 中的元素个数。 setIntersection 应该保存集合 A 和 B 之间的交集结果。但我被困在如何找到并集和交集。

int printIntersection(int setA[], int setB[], int setIntersection[], int a, int b, int k) 
{
 int i = 0;
 int j = 0;

 while(i < a && j < b)
 {
     if(setA[i] < setB[j])
     {
         i++;
     }

     else if(setA[i] > setB[j])
     {
         j++;
     }

     else if (setA[i] == setB[j])
     {
         setIntersection[k] = setA[i];
         i++;
         j++;
         k++;
     }
     cout<<"Cardinality of intersection is "<<k<<endl;
 }

此代码用于交叉路口,但我什么也没得到。我不知道从哪里开始工会。谁能帮我写代码谢谢! P.S 我只允许使用数组和简单的代码算法。提前致谢!

【问题讨论】:

  • 数组排序了吗?
  • 假设 setA 和 setB 的数组已排序,那么您的代码看起来没问题。当然可能是您尚未发布的代码已损坏。
  • 不,集合没有排序。我正在从文件中获取数据并直接放入数组中。
  • 谢谢大家。排序数组后代码工作!

标签: c++ arrays cardinality


【解决方案1】:

使用std::set_unionstd::set_intersection,例如

int *c = std::set_union(setA, setA + a, setB, setB + b, setC)
int *c = std::set_intersection(setA, setA + a, setB, setB + b, setC)

其中setC 是一个足够大的输出数组; c 指向构造范围的最后一个元素。

如果您想要基数,c - setC 就是您的答案。

我建议在算法调用中使用 std::vector 之类的东西来表示,并使用迭代器而不是数组/指针/长度。

假设输入范围已排序;输出也是。

如果你想自己做,你可以在上面的链接中找到“可能的实现”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 2010-12-18
    • 2023-04-10
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多