求两个数组的交集、并集和差集算法分析与实现(转自http://blog.sina.com.cn/s/blog_616e189f0100mrdn.html)
来源:互联网 发布:linux hplib开发资料 编辑:程序博客网 时间:2024/06/05 09:15
本文采用一种交换的方式来求出两个数组的并集,交集和差集,这种算法运算速度较快,内存消耗空间较少,是一个值得学习的好方法,另外,作者提醒您,重要的不是算法本身,而是该算法会开拓我们的思维空间,要注意对问题的多思考。
算法概述:
两个任意元素的数组,比较出两个数组中相同的元素和不同的元素。
元素划分:
计算过程中,两个数组内部元素的划分:
算法流程:
从数组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是很耗空间的。
- 求两个数组的交集、并集和差集算法分析与实现(转自http://blog.sina.com.cn/s/blog_616e189f0100mrdn.html)
- Kosaraju算法的分析和证明 转自http://blog.sina.com.cn/s/blog_4dff87120100r58c.html
- IL与CLR两个概念(转自http://blog.sina.com.cn/s/blog_49947b280100gtde.html)
- 求两个数组的交集、并集和差集算法分析与实现
- 求两个数组的交集、并集和差集算法分析与实现
- 求两个数组的交集、并集和差集算法分析与实现
- 求两个数组的交集、并集和差集算法分析与实现
- c++ new() 与new[]的区别转自http://blog.sina.com.cn/s/blog_52e27e8a0100rr24.html
- 点到线段的最短距离算法(转自 http://blog.sina.com.cn/s/blog_5d5c80840101bnhw.html)
- 基于VS2008和Matlab R2010b版本的混合编程的实现(转自:http://blog.sina.com.cn/s/blog_49cb42490100nm5j.html)
- IplImage 和 QImage的转换 (转:http://blog.sina.com.cn/s/blog_5c70dfc80100qzif.html)
- 视频测试序列的下载地址 转自:http://blog.sina.com.cn/s/blog_5fd6a0e50100dn0k.html
- Android中Uri的使用转自http://blog.sina.com.cn/s/blog_821e2bb10100spxv.html
- opencv的一个神经网络例程(转自http://blog.sina.com.cn/s/blog_61e10f020101bv94.html)
- freemarker的使用,转自http://blog.sina.com.cn/s/blog_64c505480100sxuh.html
- 借鉴:CFD建模计算 (转自 http://blog.sina.com.cn/s/blog_497df1da0100akzt.html )
- opencv的一个神经网络例程(转)(转自http://blog.sina.com.cn/s/blog_61e10f020101bv94.html)
- Java Scoket网络编程,转自commandingofficer的博客(http://blog.sina.com.cn/s/blog_616e189f0100s3px.html)
- 移动手机消息推送机制
- C++的测试及问题的提出
- 实现调用加壳的外壳中的子程序
- 分析Android 根文件系统启动过程(init守护进程分析)
- vs调试连接库
- 求两个数组的交集、并集和差集算法分析与实现(转自http://blog.sina.com.cn/s/blog_616e189f0100mrdn.html)
- mpeg4网络传输 以及Livemedia 结构分析 .
- 订单号数据类型修改--删除和创建复制订阅项目(只需要操作指定字段作为主键的那些)
- 实际用户ID、有效用户ID、设置用户ID的区别
- live555 --RTSP SET_UP PLAY 执行流程分析 .
- shell 中的双括号
- iOS Notification
- live555库的rtsp服务器源码分析总结,流程详解RTSPServer .
- dom4j含xmlns(命名空间)调用selectNodes为空问题