Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 随机二进制搜索算法_Java_Algorithm - Fatal编程技术网

Java 随机二进制搜索算法

Java 随机二进制搜索算法,java,algorithm,Java,Algorithm,下面的算法被认为是二进制搜索的一种变体,在二进制搜索中,不选择中间的索引,而是选择一个随机索引并进行比较。该算法是渐进的更差,但它只是一项任务。该算法考虑了当随机索引i处的元素等于搜索值时的情况,在这种情况下,它返回true;第二种情况是当索引i处的元素大于搜索值时,在这种情况下,我们递归地调用输入n i-1上的搜索。如果元素始终大于或等于搜索值,则算法工作正常 但是,当随机化索引处的元素小于搜索值时会发生什么情况?直觉上,我认为输入n应该增加I+1,即使检查n是否大于数组大小,我似乎也会出现堆

下面的算法被认为是二进制搜索的一种变体,在二进制搜索中,不选择中间的索引,而是选择一个随机索引并进行比较。该算法是渐进的更差,但它只是一项任务。该算法考虑了当随机索引i处的元素等于搜索值时的情况,在这种情况下,它返回true;第二种情况是当索引i处的元素大于搜索值时,在这种情况下,我们递归地调用输入n i-1上的搜索。如果元素始终大于或等于搜索值,则算法工作正常

但是,当随机化索引处的元素小于搜索值时会发生什么情况?直觉上,我认为输入n应该增加I+1,即使检查n是否大于数组大小,我似乎也会出现堆栈溢出

public static boolean search(int[] keys, int value, int n) {
    if(n <= 0 || n > keys.length) 
        return false;
    else {
        Random random =   new Random();
        int i       =   random.nextInt(n);

        if(keys[i] == value) 
            return true;
        else if(keys[i] > value) 
            return search(keys, value, i - 1);
        else 
            return search(keys, value, i + 1);
    }
}
公共静态布尔搜索(int[]键,int值,int n){
如果(n个键长度)
返回false;
否则{
随机=新随机();
int i=随机。nextInt(n);
如果(键[i]==值)
返回true;
else if(键[i]>值)
返回搜索(键、值、i-1);
其他的
返回搜索(键、值、i+1);
}
}

我认为你的代码根本上是错的。根据您所说的(问题陈述中的条件),这应该是代码:

public static boolean search(int[] keys, int value, int l, int r)
{
    if(l < 0 || r >= keys.length || l>r) return false;
    else
    {
        Random random =   new Random();
        int i       =   l + random.nextInt(r-l);

        if(keys[i] == value) return true;
        else if(keys[i] > value) return search(keys, value, l, i - 1);
        else return search(keys, value, i + 1, r);
    }
}
公共静态布尔搜索(int[]键,int值,int l,int r)
{
如果(l<0 | | r>=keys.length | l>r)返回false;
其他的
{
随机=新随机();
int i=l+random.nextInt(r-l);
如果(键[i]==值)返回true;
else if(key[i]>value)返回搜索(key,value,l,i-1);
否则返回搜索(键、值、i+1、r);
}
}

请参阅代码的这一部分

 else if(keys[i] > value) 
     return search(keys, value, i - 1); //Line1
 else 
     return search(keys, value, i + 1); //Line2
在这两种情况下,您都在阵列的同一部分中搜索

Line1
在数组中从
0
i-1
搜索

Line2
在数组中从
0
i+1
搜索

你应该做的是

Line1
应在从
0
i-1的数组中搜索


Line2
应在从
i+1
到数组末尾的数组中搜索
值。

您的
键[]
1是否已索引?如果不是(我觉得不是),请将您的
If
条件更改为
If(n<0 | | n>=keys.length)
我刚刚编辑了您的代码以在答案中发布想法。它现在应该可以工作了。我没有在索引中使用n,它被用作随机数的边界,因此如果没有元素(n=0),那么该元素在数组中不存在。我还将n作为keys.length传递,因此if(n>=keys.length)将始终返回false。假设random return
1
且值等于keys[0],则将0传递给下一个递归调用。那么它将返回false。如果这是您的假设(对于n),那么在任何情况下,您都在从索引0到(i-1)或(i+1)搜索数组的下半部分,而不是第二部分。因此,这也是错误的。我认为在每次调用该方法时初始化一个新的
Random
,是不好的做法。应该重用单个
随机
实例。您可以删除所有
其他
-s,因为如果
-s以
返回
结尾,则它们在此处无效。是的,这是真的。我只是复制并粘贴了他的代码,并进行了最少的编辑以得到正确的答案