A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁健 黑马帝   /  2011-12-10 10:26  /  1956 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 l梁键 于 2011-12-10 12:59 编辑

两个1000个元素的数组,如何有效的找出他们的交集?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 ◇半度微凉 于 2011-12-10 11:11 编辑

如果说想要最有效,最高效的话,可以直接使用java已经提供的Arrays.sort(); 对数组进行排序, 然后再遍历数组,再把一个数组的元素在另外一个数组中2分查找,找到的元素就是两个数组的交集部分!
代码可以这样写:
int arr1[]={0,45,8,97,9,8·····};//数组arr1,里面1000个元素
int arr2[]={0,45,8,9,7,9,·····};//数组arr2,里面1000个元素

Arrays.sort(arr1);   
Arrays.sort(arr2);   
int len = arr1.length   
for (int i = 0; i < len; i++)   
{   
    if (Arrays.binarySearch(arr2, arr1) != -1)   //使用java提供的二元查找法 对数组元素进行查找 比较高效
         System.out.print (arr1);   
}  

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 熊明春 于 2011-12-10 11:34 编辑

因为不知数组中具体存储的数据类型,所以以下本人愚见:
1)数据量大,如果如果用两个for循环嵌套需开辟3个近似1000的空间,计算次数1000*1000=100万次;
2)利用TreeSet二叉排序树结构插入查询效率高的特点:将数组A存入TreeSet集合tsA中,将数组B存入TreeSet集合tsB中,这样保证两个数组里的所有元素唯一;然后再将tsB迭代存入tsA中,如果存入tsA中成功,这继续;失败了,证明相交,这将这个元素存入到数组C中。返回数组C。空间资源消耗还是比较大,但时间上很快大概最多4000次吧.少很多呀!愚见!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
t_mac 黑马帝 2011-12-10 12:13:04
板凳
先把数组中元素取出,再放到List集合中(必须遍历数组再往集合添加不能直接把数组转成集合),然后再利用List的retainall()方法,我觉得这样做很简单。
简单演示一下吧:

import java.util.*;
public class TestArrayToCollection {
        public static void main(String[] args) {
                int[] a1 = {2,4,5,6};
                int[] a2 = {3,4,6,7};
               
                /*List<int[]> l1 = Arrays.asList(a1);
                List<int[]> l2 = Arrays.asList(a2);
                System.out.println(l1.contains(l2));*/注意这样直接转是不行的,因为直接利用Arrays.asList()方法转成集合,不能进行增删操作会抛
                                                                //UnsupportedOperationException异常
                List<Integer> l1 = new ArrayList<Integer>();
                List<Integer> l2 = new ArrayList<Integer>();
                for(int i=0;i<a1.length;i++){
                        l1.add(a1[i]);
                }
                for(int j=0;j<a2.length;j++){
                        l2.add(a2[j]);
                }
                System.out.println(l1);
                System.out.println(l2);
                l1.retainAll(l2);
                System.out.println(l1);//此时的l1即为要求结果
        }
}

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马