本文采用一种交换的方式来求出两个数组的并集,交集和差集,这种算法运算速度较快,内存消耗空间较少,是一个值得学习的好方法,另外,作者提醒您,重要的不是算法本身,而是该算法会开拓我们的思维空间,要注意对问题的多思考。
算法概述:
两个任意元素的数组,比较出两个数组中相同的元素和不同的元素。
元素划分:
计算过程中,两个数组内部元素的划分:

算法流程:
从数组1的尚未比较的元素中拿出第一个元素array1(i),用array1(i)与array2(j)进行比较(其中j>i且j<array2的长度),可能出现下面两种情况,
1. 数组2中找到了一个与array1(i)相等的元素,则将array2(j)与array2(i)进行交换,i加一,进行下次迭代
2. 数组2直到结尾也没找到与array1(i)相等的元素,则将array1(i)与尚未进行比较的最后一个元素array1(k)进行交换,i不加一,进行下次迭代。
算法实现代码:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void main()
{
//定义两个数组
int array1[] = {7,1,2,5,4,3,5,6,3,4,5,6,7,3,2,5,6,6};
int size1 = 18;
int array2[] = {8,2,1,3,4,5,3,2,4,5,3,2,1,3,5,4,6,9};
int size2 = 18;
int end = size1;
bool swap = false;//标识变量,表示两种情况中的哪一种
for(int i=0 ; i < end;)
{
swap = false;//开始假设是第一种情况
for(int j=i ; j < size2; j++)//找到与该元素存在相同的元素,将这个相同的元素交换到与该元素相同下标的位置上
{
if(array1[i] == array2[j])//第二种情况,找到了相等的元素
{
int tmp = array2[i];//对数组2进行交换
array2[i] = array2[j];
array2[j] = tmp;
swap = true;//设置标志
break;
}
}
if(swap != true)//第一种情况,没有相同元素存在时,将这个元素交换到尚未进行比较的尾部
{
int tmp = array1[i];
array1[i] = array1[--end];
array1[end] = tmp;
}
else
i++;
}
//结果就是在end表示之前的元素都找到了匹配,而end元素之后的元素都未被匹配
//先输出差集
cout<<"only in array1"<<endl;
for(i = end ; i < size1; i++)
{
cout<<array1[i]<<" ";
}
cout<<endl;
cout<<"only in array2"<<endl;
for(i = end ; i < size2; i++)
{
cout<<array2[i]<<" ";
}
cout<<endl;
//输出交集
cout<<"elements in array1 and array2"<<endl;
for(i = 0 ; i <end ; i++)
{
cout<<array1[i]<<" ";
}
cout<<endl;
//输出并集
cout<<"elements in array1 or array2"<<endl;
for(i = 0 ; i <end ; i++)
{
cout<<array1[i]<<" ";
}
for(i = end ; i < size1; i++)
{
cout<<array1[i]<<" ";
}
for(i = end ; i < size2; i++)
{
cout<<array2[i]<<" ";
}
cout<<endl;
}
输出结果如下:
only in array1
7 6 5 6 6 7
only in array2
1 3 2 4 8 9
elements in array1 and array2
6 1 2 5 4 3 5 5 3 4 2 3
elements in array1 or array2
6 1 2 5 4 3 5 5 3 4 2 3 7 6 5 6 6 7 1 3 2 4 8 9
Press any key to continue
中间过程图形描述:

当第0个元素时,7 与第二个数组中没有相同的元素,因此,将7与最后一个元素交换
得下面结果:

此时在使用数组1下标为0的6元素,与数组2中的元素比较,在数组2中下标为16的元素也为6,这样将数组2中下标为0和下标为16的元素进行交换,的到如下结果:

然后i需要加1,移动到数组1中的1元素

再次进行比较的到数组2中的位置2元素为2,则将数组2中的1和2两个下标的元素进行交换,得到下面的状态:

多次进行比较 得到如下中间态:

最终结果:

最坏情况是n*n就是两个集合元素没有相同的情况,最好情况是两个集合元素全相同n。
所有当两个数组重复度较高的时候,使用这个算法会带来较高的效率。并且将集合的并集交集差集一并算出,仅使用O(1)附件空间复杂度。
还有人说使用排序数组然后二分查找,排序实际很耗时的。如果使用hash是很耗空间的。
分享到:
相关推荐
集合是数学的基础概念,通常表示为一些元素的集合,例如A和B,其关系包括:A∩B表示交集,A∪B表示并集,A-B表示差集,而题目中的符号可能是这些运算的表示。 2. **复数及其几何意义**:复数由实部和虚部组成,题目...
- 集合更侧重于集合之间的并集、交集和差集操作。 - **用途**: - 字典适用于键值对的管理。 - 集合适用于需要进行集合操作的情况。 ### 5. Word 编辑菜单的功能 - **知识点**: 在Word的编辑菜单中,“粘贴”...
4. **Set**:无序且不重复的字符串集合,可以进行成员添加、删除和检查,以及交集、并集和差集操作。 5. **Sorted Set**:与Set类似,但每个元素都有一个分数,可以进行排序,支持ZADD、ZRANGE、ZREVRANGE等操作,...
集合A与B的运算关系可以是并集(A∪B)、交集(A∩B)、差集(A-B)等,需要了解这些运算的定义。 2. **三角形面积计算**:在第二题中提到通过三角形的两边和夹角计算面积,需要用到公式S = 1/2 * base * height或者S = 1...
5. 三角形中的正弦定理和余弦定理:在选择题的第5题中,利用正弦定理求出sinA,再结合已知条件应用余弦定理求出A的值,最后通过A的值求出边BC的长度,选择A。 6. 几何体的体积:选择题的第6题涉及立体几何中不同...
集合的基本运算包括并集、交集、差集和补集。题目指出集合`A∪B={1,2,3,4,5}`和全集`U={1,2,3,4,5,6,7}`,要求确定集合`A`的元素个数。根据补集定义,`A`=全集`U`减去`A∪B`的补集,即`A`=U-({1,2,3,4,5})={6,7}`,...
而列表、集合和有序集合则提供了诸如添加、删除、查找以及执行集合运算的功能,如交集、并集和差集,这对于处理关联数据和实现高级功能特别有用。 Redis的一大特性是其内存存储。所有的数据都驻留在内存中,这极大...
集合A与B的运算关系可以是A∪B(并集)、A∩B(交集)、A-B(差集)或者A⊆B(A是B的子集)。 2. **复数概念**:复数为纯虚数意味着实部为0。题目中提到复数z为纯虚数,要求实数a的值,这需要利用复数的概念和性质...
1. **集合论**:题目2询问集合的运算,考察了集合的并集和差集的概念。正确答案是D,即A∪B的补集与B的补集的交集等于A的补集。 2. **命题逻辑**:题目3是关于特称命题的否定,特称命题“存在x,P(x)”的否定是“对...
1. **集合的交并补运算**:集合A和B的运算中,如果A=,B=,那么A∩B表示A和B的交集,即所有同时属于A和B的元素组成的集合;A∪B表示A和B的并集,即所有属于A或B的元素组成的集合;A-B表示A与B的差集,即属于A但不...
掌握并集、交集、差集等运算规则,能够帮助学生在解决实际问题时更加得心应手。 解不等式组的题目要求学生对每个不等式分别求解,然后找出它们的公共解集。这类题目的关键在于,学生需要熟练掌握每个不等式的解法,...