集合问题 : 交集、并集、差集、对称差集
假设有两个集合 a 和 b。
a[] = {1,2,3,4,5,6};
b[] = {4,5,6,7,8};
如何求交集、并集、。。。等等
一、并集
1. 解析
- 借助std::map,map中key值唯一。
std::map<int,int> res;
for(int i = 0; i < sizeof(a)/sizeof(a[0]) ; i++)
{
res[a[i]] = 1;
}
for(int i = 0; i < sizeof(b)/sizeof(b[0]) ; i++)
{
res[b[i]] = 1;
}
copy(res.begin(),res.end(),ostream_iterator<int>(cout," "));
//-> 最后得出的res中所有元素就是集合a 和 集合b 的并集。
- 利用数组。
- 假设集合a和b中的最大值为N,定义一个数组res,大小为N,并初始化为0;
- 遍历集合a和b,将对应数字在res中+1
- 遍历res。输出值不为0的对应元素下标。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int a[] = {
1,2,3,4,5,6};
int b[] = {
4,5,6,7,8};
int res[10] = {
0};
for(int i = 0; i < 6 ; i++)
{
res[a[i]] += 1;
}
for(int i = 0; i< 5; i++)
{
res[b[i]] += 1;
}
for_each(begin(res),end(res),[](int val){
static int i = 0;
if(val != 0)
cout << i <<" ";
i++;
}
);
cout << endl;
return 0;
}
STL 提供了相应的高效稳定的算法。
2. set_union
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp);
求集合[first1,last1) 和[ first2,last2) 的并集,结果输出到result。不过该算法要求两个集合已排序(默认为升序,如果集合已经按降序排列,求并集时则需要指定comp比较谓词,比较器 greater<type>()
)。
算法源码:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result)
{
while (true)
{
if (first1==last1) return std::copy(first2,last2,result);
if (first2==last2) return std::copy(first1,last1,result);
if (*first1<*first2) { *result = *first1; ++first1; }
else if (*first2<*first1) { *result = *first2; ++first2; }
else { *result = *first1; ++first1; ++first2; }
++result;
}
}
测试代码:
#include <iostream> // std::cout
#include <algorithm> // std::set_union, std::sort
#include <vector> // std::vector
int main () {
int first[] = {
5,