本文采用一种交换的方式来求出两个数组的并集,交集和差集,这种算法运算速度较快,内存消耗空间较少,是一个值得学习的好方法,另外,作者提醒您,重要的不是算法本身,而是该算法会开拓我们的思维空间,要注意对问题的多思考。
算法概述: 两个任意元素的数组,比较出两个数组中相同的元素和不同的元素。 元素划分: 计算过程中,两个数组内部元素的划分:
算法流程: 从数组1的尚未比较的元素中拿出第一个元素array1(i),用array1(i)与array2(j)进行比较(其中j>i且j<array2的长度),可能出现下面两种情况,
1.
2. 算法实现代码: #include <iostream> using std::cout; using std::cin; using std::endl; void main() { //定义两个数组 //先输出差集 //输出交集 //输出并集 } 输出结果如下: 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是很耗空间的。 本文算法由本文作者所创,不知道是否有高明之士与作者想法雷同,转载请注明出处。 |
|