A、B两个整数集合的交集

rt,这是一个经典问题。

参考1:http://www.sysexpand.com/?path=exercises/array-intersection

参考2:http://leetcode.com/2010/03/here-is-phone-screening-question-from.html

用数组来模拟(本质上说集合中是没有重复元素的,这里用数组来模拟可以用重复元素),A、B数组长度分别为m和n。总的来说,分为以下几种方案。

方案1:两重循环判断(复杂度 O(m*n))

暴力方法,并且不容易去除重复元素

方案2:Hash Table方法(复杂度 O(m+n))

将A写入Hash Table,让后B在Hash Tabe中写入过程中判断重复即可。如果没有重复元素,唯一缺点是内存占用量大,可以使用《编程珠玑》中的BitMap方法节省内存。另外Hash过程中可能会有比较多的冲突。

另外,本方法不具有普遍性。

方案3:排序后对A中每个元素在B中进行二分查找(复杂度 O(nlogn+mlogm)

这里m<=n。否则排序后对B中每个元素在A中进行二分查找(复杂度 O(n*lgm))

注意,排序的复杂度是O(nlogn+mlogm),查找的复杂度是O(n*lgm)。

方案4:排序后应用归并排序的思想进行判断(复杂度 O(nlogn+mlogm)

指针i和j分别指向A和B的开头,如果对应元素相等即为交集,否则谁小谁的指针加1往后移动。

  注意,排序的复杂度是O(nlogn+mlogm),归并过程是O(m+n),比方案3更优。

下面是实现部分,并且去除了重复元素。

/**
 * 创建时间:2014年8月16日 上午11:46:12
 * 项目名称:Test
 * @author Cao Yanfeng   Peking University
 * @since JDK 1.6.0_21
 * 类说明:测试两个数组的交集,交集中不包含重复数
 */
public class Intersectionof2ArraysTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array1={4,6,2,4,3,5,1};
		int[] array2={4,4,9,6,8,7,5,5,6,7};
		LinkedList<Integer> linkedList=Intersectionof2Arrays(array1, array2);
		for (Integer integer : linkedList) {
			System.out.println(integer);
		}
	}
	public static LinkedList<Integer> Intersectionof2Arrays(int[] array1,int[] array2) {
		LinkedList<Integer> linkedList=new LinkedList<Integer>();
		int m=array1.length;
		int n=array2.length;
		quicSort(array1, 0,m-1);
		quicSort(array2, 0,n-1);
		/*初步判断两种没有任何交集的情况*/
		if (array1[0]>array2[n-1]|array1[m-1]<array2[0]) {
			return linkedList;
		}
		int same=array1[0]-1;//有可能溢出
		int i=0;
		int j=0;
		while (i<m&&j<n) {
			if (array1[i]==array2[j]) {
				/*去除重复数*/
				if (same!=array1[i]) {
					linkedList.add(array1[i]);
					same=array1[i];
				}
				i++;
				j++;
			}else if (array1[i]<array2[j]){
				i++;
			}else {
				j++;
			}
		}

		return linkedList;

	}
	public static void quicSort(int[] arr, int start, int end) {
		if (start < end) {
			int middle = getMiddle(arr, start, end);
			quicSort(arr, start, middle - 1);
			quicSort(arr, middle + 1, end);
		}

	}

	public static int getMiddle(int[] arr, int start, int end) {
		int temp = arr[start];
		while (start < end) {
			while (start < end && arr[end] >= temp) {
				end--;
			}
			arr[start] = arr[end];
			while (start < end && arr[start] <= temp) {// 括号中end--之后可能不满足条件
				start++;
			}
			arr[end] = arr[start];

		}
		arr[start] = temp;
		return start;
	}

}

A、B两个整数集合的交集

时间: 2024-11-05 16:27:00

A、B两个整数集合的交集的相关文章

求两个整数集合的交集

这里要用到C++-STL中的set容器,这个容器的特点就是去重! 设计测试:给定两个集合 a[] = {1,2,3,4,5,6}; b[] = {4,5,6,7,8,9}; 则集合的交集为4,5,6 代码如下,仅供参考: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <set> 5 #define M 6 6 #define N 6 7 using name

C++程序设计实践指导1.5求两个整数集合并集改写要求实现

改写要求1:改写为单链表结构可以对任意长度整数集合求并集 #include <cstdlib> #include <iostream> using namespace std; struct LinkNode { int data; LinkNode* next; }; class SET { public: struct LinkNode* creat(int x[],int len); struct LinkNode* copy(LinkNode* aHead); int no

A、B两个整数集合,设计一个算法求他们的交集

代码留作记录,本人水平有限,看了别人的解法真是自愧不如. 关于此题的详细探讨可以参考:http://blog.csdn.net/thebestdavid/article/details/12056293 /*A.B两个整数集合,设计一个算法求他们的交集,尽可能的高效.*/ #include <iostream> #include <cstring> #include <set> #define M 8 #define N 5 using namespace std; i

A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效(牛客网)

#include<iostream> using namespace std; /* 1)先使用快速排序,使得两个数组有序: 2)然后利用二分查找的方法,在数组B中查找: 3)其中,注意在数组B中,使用二分查找的起点,是根据上次查找的结果开确定的:这样可以进一步提高速度: */ int Sort(int array[],int low,int high) { int temp=array[low]; int pos=low; while(low<high) { while(array[h

Java大集合求交集的方法比较

两个List集合求交集想必学过Java的都知道用系统自带的retainAll()方法,但是在数据量比较大时,这个方法效率并不高,利用空余时间研究了几种数据量较大时求两个集合交集的办法.本文主要研究了JDK自带方法求交集.Guava集合求交集.Java8的parallelStream并行流求交集.双指针方法求交集以及bitmap求交集的方法和效率. JDK自带方法 最常用的求交集方法,在小数据量的时候没什么问题,一旦两个集合的数据量达到几十万级别时,效率就严重偏低,底层实际上也是两个for循环,只

计算两个集合的交集数字(java)

循环判断2个数组 将相同的公共元素复制到新数组中即可 1 2 3 import java.util.Arrays; 4 5 public class count_same_number { 6 7 public static int[] join(int[] a,int[] b) 8 { 9 int count=0; 10 int new_target[]=new int[Math.max(a.length, b.length)];//新数组 11 int index=0; 12 for(int

给定N个整数集合是否存在两个其和刚好为指定常数的元素

重新学习一遍<算法导论>,看到了这个问题: 描述一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数 X 时,判断出S中是否存在有两个其和刚好等于 X 的元素. Solution: (1)->对整个集合进行排序,可以用快排(含有小文件策略.三者取中策略),时间复杂度O(nlogn),形成一个数组A[n]. ->设定两个下标pBegin和pEnd,分别指向数组A[n]的头尾,pBegin = 0,pEnd = n -1. ->若(A[pBegi

求两个集合的交集和并集C#

我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace JiaoJi { class Program { static void Main(string[] args) { int [] arrA=new int[8]{1,2,3,4,5,6,7,8}; int [] arrB=new int[5]{4,5,

mysql获取两个集合的交集和差集

mysql中获取两个集合的交集,我的方法如下: 1.两个集合的结构要一致,对应的字段数,字段类型 2.将两个集合用 UNION ALL 关键字合并,这里的结果是有重复的所有集 3.将上面的所有集 GROUP BY id 4.最后 HAVING COUNT(id)=1,等于1的意思是只出现了一次,所以这个是差集,如果等于2,那么就是交集 这是实现的基本原理,具体如下: 1 -- 下面的sql有明显的问题,不过这个只是一个示意,从一个表中查询不需要用到交集和差集,条件可以合并在一起直接查询出来的.能