日期:2014-05-20  浏览次数:20633 次

如何取两个已排序数组的交集?
例:
1,3,5,6,7,9
2,4,6,7,8,9
如何能够最快的取出交集.
有没有什么好的算法.我不想去一个一个的循环比较.

------解决方案--------------------
好像没有直接的方法可以用
------解决方案--------------------
没想出来,帮你顶一下,关注中...
------解决方案--------------------
Apache Jakarta Commons 有 Collections 包,里面有个 CollectionUtil.intersection() 方法,就是取两个集合中的交集。

但是对于你的这个问题,看样子好像需要自己设计算法。
------解决方案--------------------
一个一个的循环比较就行了,因为已经排好序了的,如果比较数> =待比较数,就break到下一轮查找,这应该已经很高效了吧……
------解决方案--------------------
必须要遍历。至于算法,也许有比较好的,不过偶不知道。。。。
------解决方案--------------------
因为是排好序了,可以同时搜索
int[] a = {1,3,5,6,7,9};
int[] b = {2,4,6,7,8,9};
Set s = new HashSet();
for (int i=0, j=0; i <a.length && j <b.length; ) {
if (a[i]==b[j]) {
s.add( " "+a[i]);
i++;
j++;
} else if (a[i] > b[j]){
j++;
} else {
i++;
}
}
if (s.size()==0) {
Sytem.out.println( "no intersection ");
} else {
System.out.println(Arrays.toString(s.toArrays()));
}

------解决方案--------------------
collect接口有两个方法你去看下对你很有帮助,就是取交集用的

boolean retainAll(Collection <?> c)

仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。换句话说,移除此 collection 中未包含在指定 collection 中的所有元素。


boolean removeAll(Collection <?> c)

移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。此调用返回后,collection 中将不包含任何与指定 collection 相同的元素。


------解决方案--------------------
如果还不了解.请看下面示例

int[] a = {1,3,5,6,7,9};
int[] b = {2,4,6,7,8,9};

List list = new ArrayList(Arrays.asList(a));
list.retainAll(Arrays.asList(b)); // list 中的就是交集了.
------解决方案--------------------
public static <T> List <T> asList(T... a)

返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)此方法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。
------解决方案--------------------
用retainAll当然是最简单的代码,但是这样就体现不出排序数组的优势,
用qybao(阿宝) 的方法可减少循环次数
------解决方案--------------------
如果是未排好序的,Collection可能会快, 但是排好序的Collection就不一定见得比自己写的算法快了。如果追求代码简洁,也可以用Collection
------解决方案--------------------
楼上的和我一样有同感,幸会幸会
------解决方案--------------------
同意阿宝的处理方式。
------解决方案--------------------
你们没看清楚LZ的问题吗??


如何能够最快的取出交集.
有没有什么好的算法.我不想去一个一个的循环比较.



------解决方案--------------------
mark
------解决方案--------------------
在这问题上我同意bushuang的处理方式。
------解决方案--------------------
恩,有新意啊
------解决方案--------------------
1,3,5,6,7,9
2,4,6,7,8,9

用两个整型,第一位代表0,第二位1,以此类推.