您好我正在查看以下链接中关于此搜索算法的这篇文章,当我尝试运行它时,一切正常,打印出您要搜索的数字(l)的索引值,但是如果你要搜索的数字(l)是数组中的第一个元素然后它只打印-1而不是0.需要在这个程序中进行哪些校正?让我们说int l = 3,那么它应该打印0。
以下代码来自这篇文章 jump search algorithm进行了Alex Winston所述的更正。
我完全按照这篇wiki文章http://en.wikipedia.org/wiki/Jump_search发布了有关此算法实现的内容
import java.math.*;
public class jamp {
public static int min(int a,int b) {
return a<b?a:b;
}
public static void main(String[]args) {
int a[]=new int[]{3,7,9,12,14,15,16,17,18};
int l=14; //lets say int l = 3;
System.out.println(jumpsearch(a,a.length,l));
}
public static int jumpsearch(int a[],int n, int l ) {
int t=0;
int b=(int)Math.sqrt(n);
while (a[min(b,n)-1]<l){
t=b;
b=b+(int)Math.sqrt(n);
if ( t>=n) return -1 ;
}
while (a[t]<l){
t=t+1;
if ( t==min(b,n))
return -1 ;
if ( a[t]==l) {
return t;
}
}
return -1; // if this is 0, then it works but if you search for a element that is not in the array then it still prints 0 which is incorrect
}
}
答案 0 :(得分:0)
该部分存在错误:
while (a[t]<l){
t=t+1;
if ( t==min(b,n))
return -1 ;
if ( a[t]==l) {
return t;
}
}
对于l = 3
,所以在第一个循环后t = 0
和a[t] == l
,所以while循环a[t] < l
的条件为false,所以你的程序直接返回-1没有进入循环。
您可以在进入此循环之前添加条件检查:
if(a[t] == l)
return t;
while(a[t] < l){
//the rest of your code.
}