问题: 一个表(可能未排序)中的顺序搜索
一般需要对表中的每个元素做两次判断(第一次检查 下标 i 是否已经到数组末尾,第二次检查 x[i] 是否为所需元素),但是可以在数组末尾放置一个哨兵值,就可以把第一种判断也替换为第二种判断
示例程序及结果如下
package programmingPearls;
/**
* Create by xudong
* Author: xudong
* Date: 2019-04-29
*/
public class Sentry {
//顺序搜索 无哨兵
public static int ssearch1(int t, int n){
Integer[] arrayIntN = new Integer[n];
for(int i = 0; i < n; i++){
arrayIntN[i] = i;
}
long timestart = System.nanoTime();
for(int i = 0; i < n; i++){
if(arrayIntN[i] == t){
long timeend = System.nanoTime();
System.out.println("双重检查时消耗时间为: " + (timeend-timestart) );
return i;
}
}
long timeend = System.nanoTime();
System.out.println("双重检查时消耗时间为: " + (timeend-timestart) );
return -1;
}
//顺序搜索 有哨兵
public static int ssearch2(int t, int n){
Integer[] arrayInt = new Integer[n+1];
for(int i = 0; i < n; i++){
arrayInt[i] = i;
}
//设置哨兵
arrayInt[n] = t;
int hold;
long timestart = System.nanoTime();
for(int i = 0; ; i++){
if(arrayInt[i] == t){
hold = i;
break;
}
}
if(hold == n){
long timeend = System.nanoTime();
System.out.println("有末位哨兵检查时消耗时间为: " + (timeend-timestart) );
return -1;
}else {
long timeend = System.nanoTime();
System.out.println("有末位哨兵检查时消耗时间为: " + (timeend-timestart) );
return hold;
}
}
public static void main(String[] args) {
int i = Sentry.ssearch1(1000000,10000000);
int j = Sentry.ssearch2(1000000,10000000);
System.out.println("i = " + i + "; j = " + j );
}
}
结果
双重检查时消耗时间为: 4780589
有末位哨兵检查时消耗时间为: 3851272
i = 1000000; j = 1000000
Process finished with exit code 0