您的位置:首页 > 其它

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

2015-08-13 17:13 656 查看
来源:点击打开链接

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

算法概述:

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

元素划分:

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





算法流程:

从数组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是很耗空间的。

本文算法由本文作者所创,不知道是否有高明之士与作者想法雷同,转载请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: