`
andyliuxs
  • 浏览: 139848 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

求两个数组的交集、并集和差集算法分析与实现(转自http://blog.sina.com.cn/s/blog_616e189f0100mrdn.html)

阅读更多

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

 

算法概述:

两个任意元素的数组,比较出两个数组中相同的元素和不同的元素。

 

元素划分:

计算过程中,两个数组内部元素的划分:

 

 求两个数组的交集、并集和差集算法分析与实现

算法流程:

从数组1的尚未比较的元素中拿出第一个元素array1(i),用array1(i)array2(j)进行比较(其中j>ij<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下标为06元素,与数组2中的元素比较,在数组2中下标为16的元素也为6,这样将数组2中下标为0下标为16的元素进行交换,的到如下结果:

求两个数组的交集、并集和差集算法分析与实现

 

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

求两个数组的交集、并集和差集算法分析与实现

 

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

求两个数组的交集、并集和差集算法分析与实现

 

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

求两个数组的交集、并集和差集算法分析与实现

 

最终结果:

求两个数组的交集、并集和差集算法分析与实现

 

最坏情况是n*n就是两个集合元素没有相同的情况,最好情况是两个集合元素全相同n

所有当两个数组重复度较高的时候,使用这个算法会带来较高的效率。并且将集合的并集交集差集一并算出,仅使用O1)附件空间复杂度。

还有人说使用排序数组然后二分查找,排序实际很耗时的。如果使用hash是很耗空间的。

分享到:
评论

相关推荐

    高中高三数学1月月考试题 文 试题.doc

    集合是数学的基础概念,通常表示为一些元素的集合,例如A和B,其关系包括:A∩B表示交集,A∪B表示并集,A-B表示差集,而题目中的符号可能是这些运算的表示。 2. **复数及其几何意义**:复数由实部和虚部组成,题目...

    2021-2022计算机二级等级考试试题及答案No.11511.docx

    - 集合更侧重于集合之间的并集、交集和差集操作。 - **用途**: - 字典适用于键值对的管理。 - 集合适用于需要进行集合操作的情况。 ### 5. Word 编辑菜单的功能 - **知识点**: 在Word的编辑菜单中,“粘贴”...

    redis的使用实战教程

    4. **Set**:无序且不重复的字符串集合,可以进行成员添加、删除和检查,以及交集、并集和差集操作。 5. **Sorted Set**:与Set类似,但每个元素都有一个分数,可以进行排序,支持ZADD、ZRANGE、ZREVRANGE等操作,...

    湖北省孝感市七校教学联盟高一数学下学期期末考试试题 理 试题.doc

    集合A与B的运算关系可以是并集(A∪B)、交集(A∩B)、差集(A-B)等,需要了解这些运算的定义。 2. **三角形面积计算**:在第二题中提到通过三角形的两边和夹角计算面积,需要用到公式S = 1/2 * base * height或者S = 1...

    广东署山市顺德市李兆基中学2018届高三数学下学期考前热身考试试题理201806110354

    5. 三角形中的正弦定理和余弦定理:在选择题的第5题中,利用正弦定理求出sinA,再结合已知条件应用余弦定理求出A的值,最后通过A的值求出边BC的长度,选择A。 6. 几何体的体积:选择题的第6题涉及立体几何中不同...

    吉林省长春市九台区2018 2019学年高一数学下学期期中试题.doc

    集合的基本运算包括并集、交集、差集和补集。题目指出集合`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指南.docx

    而列表、集合和有序集合则提供了诸如添加、删除、查找以及执行集合运算的功能,如交集、并集和差集,这对于处理关联数据和实现高级功能特别有用。 Redis的一大特性是其内存存储。所有的数据都驻留在内存中,这极大...

    湖南省郴州市2020届高三数学第一次教学质量监测12月试题理202001020214

    集合A与B的运算关系可以是A∪B(并集)、A∩B(交集)、A-B(差集)或者A⊆B(A是B的子集)。 2. **复数概念**:复数为纯虚数意味着实部为0。题目中提到复数z为纯虚数,要求实数a的值,这需要利用复数的概念和性质...

    安徽省宿松县凉亭中学2015届高三数学上学期第二次月考试题文无答案

    1. **集合论**:题目2询问集合的运算,考察了集合的并集和差集的概念。正确答案是D,即A∪B的补集与B的补集的交集等于A的补集。 2. **命题逻辑**:题目3是关于特称命题的否定,特称命题“存在x,P(x)”的否定是“对...

    广西北流市实验中学2019_2020学年高一数学下学期开学检测试题含解析

    1. **集合的交并补运算**:集合A和B的运算中,如果A=,B=,那么A∩B表示A和B的交集,即所有同时属于A和B的元素组成的集合;A∪B表示A和B的并集,即所有属于A或B的元素组成的集合;A-B表示A与B的差集,即属于A但不...

    天津市静海区 高二数学9月联考试题.doc

    掌握并集、交集、差集等运算规则,能够帮助学生在解决实际问题时更加得心应手。 解不等式组的题目要求学生对每个不等式分别求解,然后找出它们的公共解集。这类题目的关键在于,学生需要熟练掌握每个不等式的解法,...

Global site tag (gtag.js) - Google Analytics