2012年2月3日星期五

Java中查找数组中的某个元素

假设你有一个很大的数组,现在你想知道一个元素是不是在这个数组中,你会如何做呢?一种方法是使用for循环,一个一个从数组中找,这是最直接也是最笨的方法。因为你不可避免地要一个一个去数那些无用的元素。比较好一点的方法是使用Arrays类的binarySearch方法。废话不说,直接上代码。
import java.util.*;
class Test{
    public static void main(String[] args){
        int[] a = new int[10000000];
        for(int j=0;j<10000000;j++){
           a[j]=j;
       }
    
      long start = Calendar.getInstance().getTimeInMillis();
     for (int j =0; j<10000000; j++){
         if (a[j] == a.length-1) 
       break;
     }
     long end = Calendar.getInstance().getTimeInMillis();
     System.out.println(end-start);
     long start1 = Calendar.getInstance().getTimeInMillis();
    
    int t =Arrays.binarySearch(a,0,a.length,a.length-1);
    long end1 = Calendar.getInstance().getTimeInMillis();
    System.out.println(end1-start1);
    
   }
}
在我的机器上顺序查找消耗的时间是18ms,binarySearch的时间是0。不难看出,顺序查找的平均消耗时间要远远高于binarySeach;同时顺序查找的时间很不稳定,如果查找对象集中在数组的后部,那么消耗的时间还要远远高于平均时间。

6 条评论:

Li Ruibo 说...

没看懂

另,用 pastebin 吧,你这个看起来太困难了

Unknown 说...

改进了一下,现在看代码没问题了。

Unknown 说...

原代码中循环的最大值应该是a.length,但是在html中会出错,是和谁冲突了?没办法先改成了10000000.

Unknown 说...

lyman你可真快啊,我还在调格式你都发表评论了。

Li Ruibo 说...

binary search 不是要求 array 有序么…
java 的 binarySearch 有啥神奇的地方?先排序?

Unknown 说...

不排序,就是二分查找。Arrays自己有sort()。binarySearch虽然比顺序查找省时间,但是我希望查找应该是O(1)的,用HashSet可能更有效率。但是将一个大数组构建为一个HashSet所带来的消耗是否足够小我没有测试过,有时间好好研究一下。