无风之谷 发表于 2010-10-25 10:52

2个List的比较优化问题

有两个list——list1和list2.每个list的大小为95000。现在要求出2个list中相同的数据,哪种方法时间最快?
我现在有3个方案。
方案1:2层for循环进行比较,比较并写库的时间一共为42分钟。
方案2:用map保存list1记录,然后查看list2中的每条数据是否在list1中,比较并写库的时间一共为32分钟,比方案1快了10分钟。
方案3:使用list1.retainAll(list2),未进行测试。
哪位达人还有更好的优化方案。。。

eye_onme 发表于 2010-10-25 23:21

大小都一样,一次循环就可以了, 1,2方法都不必考虑了

kakasi 发表于 2010-10-26 10:00

这跟你一开始把数据load到什么样的结构中有关,比如array, arraylist, linkedlist, map,,都会有不同的考虑。
如果是基于Arraylist, 只能考虑怎么在compare的过程中,动态减少第二个list的大小(比如overwrite一下contains方法来实现),来减少整体的比较次数。最少也得nlogn吧

surpass_li 发表于 2010-10-28 08:50

我只用过方案1

小i 发表于 2010-10-31 20:44

感觉你的性能瓶颈可能是在对象比较和入库这两个地方。
    /**
   * Cost 220 second.
   *
   * @param list1
   * @param list2
   * @return
   */
    public static Collection<Integer> alg1(List<Integer> list1, List<Integer> list2) {
      Set<Integer> equSet = new HashSet<Integer>();
      
      for (int i = 0; i < list1.size(); i++) {
            Integer int1 = list1.get(i);
            for (int j = 0; j < list2.size(); j++) {
                if (int1.equals(list2.get(j))) {
                  equSet.add(int1);
                }
            }
      }
      
      return equSet;
    }

    /**
   * Cost 98 second.
   *
   * @param list1
   * @param list2
   * @return
   */
    public static Collection<Integer> alg2(List<Integer> list1, List<Integer> list2) {
      List<Integer> listEqu = new ArrayList<Integer>(list1);
      
      listEqu.retainAll(list2);
      
      return listEqu;
    }

    /**
   * Cost 0.047 second.
   *
   * @param list1
   * @param list2
   * @return
   */
    public static Collection<Integer> alg3(List<Integer> list1, List<Integer> list2) {
      Set<Integer> equSet = new HashSet<Integer>();
      Set<Integer> tmpSet = new HashSet<Integer>();
      
      for (Integer i : list1) {
            tmpSet.add(i);
      }
      for (Integer i : list2) {
            if (tmpSet.contains(i)) {
                equSet.add(i);
            }
      }
      
      return equSet;
    }

surpass_li 发表于 2010-11-01 09:05

美女真历害

tong0245 发表于 2010-11-01 10:24

回复 6# surpass_li


    他是雌雄同体

surpass_li 发表于 2010-11-01 11:43

回复surpass_li


    他是雌雄同体
tong0245 发表于 2010-11-01 10:24 http://bbs.chinaunix.net/images/common/back.gif


    :oo

renxiao2003 发表于 2010-11-02 10:59

回复 2# eye_onme


    你说的方案是行不通的。

eye_onme 发表于 2010-12-24 23:41

回复 9# renxiao2003

两个单向链表我都从第一个node开始遍历, 如List-A , List-B,顺序的把每个元素都放到HashMap 1中, 如果已经存在相同的元素,则写入到HashMap 2中,2中就是重复的元素
页: [1] 2
查看完整版本: 2个List的比较优化问题