如何取两个已排序数组的交集?
例:
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,以此类推.