【发布时间】:2019-04-27 16:31:43
【问题描述】:
我决定减少在数组中查找元素所需的比较次数。在这里,我们将列表的最后一个元素替换为搜索元素本身,并运行一个 while 循环以查看列表中是否存在搜索元素的任何副本,并在找到搜索元素后立即退出循环。请参阅代码 sn-p 进行说明。
import java.util.Random;
public class Search {
public static void main(String[] args) {
int n = 10000000;
int key = 10000;
int[] arr = generateRandomSize(n);
long start = System.nanoTime();
int find = sentinels(arr, key);
long end = System.nanoTime();
System.out.println(find);
System.out.println(end - start);
arr = generateRandomSize(n);
start = System.nanoTime();
find = linear(arr, key);
end = System.nanoTime();
System.out.println(find);
System.out.println(end - start);
}
public static int[] generateRandomSize(int n) {
int[] arr = new int[n];
Random rand = new Random();
for (int i = 0; i < n; ++i) {
arr[i] = rand.nextInt(5000);
}
return arr;
}
public static int linear(int[] a, int key) {
for(int i = 0; i < a.length; ++i) {
if (a[i] == key) {
return i;
}
}
return -1;
}
public static int sentinels(int[] a, int key) {
int n = a.length;
int last = a[n-1];
a[n-1] = key;
int i = 0;
while (a[i] != key) {
++i;
}
a[n-1] = last;
if ((i < n - 1) || a[n-1] == key ) {
return i;
}
return -1;
}
}
因此,使用哨兵搜索我们不会像 i
【问题讨论】:
-
i < arr.length不太可能花费太多时间。 Potentially related? -
您的基准测试中存在缺陷,这意味着您获得的任何结果都必须被视为可疑。请阅读:"How to write a correct micro-benchmark in Java"
-
这两种方法也需要O(n)才能完成工作,你在我的电脑里的例子
sentinels更快 -
@rustyx 不,请仔细检查哨兵实施
-
@rustyx 也是,我正在使用 0、5000 之间的值初始化数组并试图找到 10000
标签: java algorithm search optimization