使用哨兵的搜索算法

时间:2010-05-29 09:01:23

标签: java algorithm

我正在尝试使用哨兵进行搜索算法,将时间减少到3.87n纳秒  例如,与此代码比较

 int search (int t ){    
 for (int i=0;i<n;i++)
  if (x[i]==t)
   return i;
  return -1;
}

需要4.06纳秒

所以我想在这里优化它是代码

public class Search{

public static int search(int a[], int t) {
int i;
int p=0;
 int n=a.length;
int hold;
 hold=a[n-1];
 a[n-1]=t;
  for ( i=0;;i++)
  if (a[i]==t)  break;
    a[n-1]=t;
  if (i==n){
 p= -1;
} else{
   p= i;
}
return p;
}

public static  void main(String[]args){
int t=-1;
int a[]=new int[]{4,5,2,6,8,7,9};
 System.out.println(search(a,t));  
}
}

但是告诉我,9位于第6位,这是正确的,但如果t = 1或其他不是阵列的东西,它也显示我的位置6请帮助

2 个答案:

答案 0 :(得分:1)

假设您在数组t=-1中查找a = [4,5,2,6,8,7,9]。 你问,为什么结果是6。 看,

public class Search {

public static int search(int a[], int t) {
  int i;
  int p=0;
  int n=a.length;  // n = 7
  int hold;
  hold=a[n-1];  // hold = a[6] = 9; a[6] - is the last element.
  a[n-1]=t;  // a[6] = -1;
  for ( i=0;;i++)
    if (a[i]==t)  break;  // it will break, when i = 6, cause a[6] = -1;
  // after this root finished, i = 6.
  a[n-1]=t;  // a[6] = -1; again ^^
  if (i==n){  // i!=n, 6!=7.
    p= -1;
  } else{  // this branch will work.
    p= i;  // p = 6;
  }
  return p;  // return 6;
}

答案 1 :(得分:-1)

public class Search {

public static int search(int a[], int t) {
  int i=0;
  try {
    for(i=0;;i++)
      if(t==a[i])
        return i;
}
  catch(ArrayIndexOutOfBoundsException e)
    return -1;    
}
}

try-catch删除了与sentinel的交换问题