假设你有一个很大的数组,现在你想知道一个元素是不是在这个数组中,你会如何做呢?一种方法是使用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 条评论:
没看懂
另,用 pastebin 吧,你这个看起来太困难了
改进了一下,现在看代码没问题了。
原代码中循环的最大值应该是a.length,但是在html中会出错,是和谁冲突了?没办法先改成了10000000.
lyman你可真快啊,我还在调格式你都发表评论了。
binary search 不是要求 array 有序么…
java 的 binarySearch 有啥神奇的地方?先排序?
不排序,就是二分查找。Arrays自己有sort()。binarySearch虽然比顺序查找省时间,但是我希望查找应该是O(1)的,用HashSet可能更有效率。但是将一个大数组构建为一个HashSet所带来的消耗是否足够小我没有测试过,有时间好好研究一下。
发表评论