Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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_Binary Search - Fatal编程技术网

Java 在具有布尔值的数组中进行二进制搜索

Java 在具有布尔值的数组中进行二进制搜索,java,binary-search,Java,Binary Search,我有一个带有布尔值的数组。但这些元素的顺序如下: 首先执行true值,然后执行false值。 比如说, boolean[] booleans = {true, true, true, true, true, false, false, false, false, false, false}; 现在我们有了一个带有布尔值的排序数组,如果存在true值,则从true值开始 任务是首先查找false元素。 我使用二进制搜索算法创建了一个带有搜索方法的类 public

我有一个带有布尔值的数组。但这些元素的顺序如下: 首先执行
true
值,然后执行
false
值。 比如说,

boolean[] booleans = {true, true, true, true, true,
                false, false, false, false, false, false};
现在我们有了一个带有布尔值的排序数组,如果存在
true
值,则从
true
值开始

任务是首先查找
false
元素。

我使用二进制搜索算法创建了一个带有搜索方法的类

public class BinarySearch {

    public static int search(boolean[] array) {

        int low = 0, mid = 0;
        int high = array.length - 1;
        boolean booleanValue;

        while (low <= high) {
            mid = (low + high) >>> 1;
            booleanValue = array[mid];
            if (booleanValue) low = mid + 1;
            else high = mid - 1;
        }

        return mid == array.length - 1 ? -(low + 1) : mid;
    }

    public static void main(String[] args) {

        boolean[] booleans = {true, true, true, true, true,
                false, false, false, false, false, false};

        int search = search(booleans);
        System.out.println("search = " + search);
    }
}
公共类二进制搜索{
公共静态整型搜索(布尔[]数组){
int低=0,中=0;
int高=数组长度-1;
布尔布尔值;
而(低>>1;
布尔值=数组[mid];
如果(布尔值)低=中+1;
否则高=中-1;
}
return mid==array.length-1?-(low+1):mid;
}
公共静态void main(字符串[]args){
布尔[]布尔={true,true,true,true,
假,假,假,假,假,假,假};
int search=搜索(布尔);
System.out.println(“search=“+search”);
}
}
它工作不正常,即有时返回所搜索元素的上一个元素。
通过迭代搜索查找元素也不是一个好主意,因为数组的大小可能非常大,而且需要花费很多时间。

编辑:实际上我需要在MySQL数据库表中搜索,但是表的大小太大,查找所需行需要花费很多时间,我想使用二进制搜索算法进行紧固。

Edit:MySQL表大小超过4500万行。通过SQL查询搜索所需行时,无论我是否向列添加索引,都需要大约30秒。此外,在
boolean
中添加索引不会产生任何效果。
当我使用二进制搜索时,大约需要10毫秒。因此我希望更正上述方法。

Edit:例如,我有一个名为“INFORMATION”的DB表。它有两列“INFO”(文本)和“CHECKED”(布尔值)。初始值为“INFO”s为
false
。我将获取第一个未选中的信息,并从未选中开始获取N行,然后我将检查它们并将它们标记为
true
。该过程将重复,直到没有未选中的信息。

在循环期间,如果布尔值为false

  • 如果low=mid,起点和终点相遇,我们就找到了我们需要的
  • else high=mid,因为mid绝对是一个潜在的候选人
  • 修改如下:

        while (low <= high) {
            mid = (low + high) >>> 1;
            booleanValue = array[mid];
            if (booleanValue) {
                low = mid + 1;
            }
            else {
                if (low == mid) {
                    break;
                }
                high = mid;
            }
        }
    
    while(low>>1;
    布尔值=数组[mid];
    if(布尔值){
    低=中+1;
    }
    否则{
    如果(低==中){
    打破
    }
    高=中;
    }
    }
    
    我修改了新黄的回答,并将代码简化了一点:

    public static int search(boolean[] array) {
    
        int low = 0, mid;
        int high = array.length - 1;
        boolean booleanValue;
    
        while (low <= high) {
            mid = (low + high) >>> 1;
            booleanValue = array[mid];
            if (booleanValue) low = mid + 1;
            else if (low == mid) return mid;
            else high = mid;
        }
        return -low;
    }
    
    公共静态整型搜索(布尔[]数组){
    int低=0,中;
    int高=数组长度-1;
    布尔布尔值;
    而(低>>1;
    布尔值=数组[mid];
    如果(布尔值)低=中+1;
    否则,如果(低==中)返回中;
    否则高=中;
    }
    回报率低;
    }
    

    因此,现在该方法返回数组中第一个
    false
    元素的索引(如果找到元素),如果未找到元素,则返回负值。

    使用调试器。当大小为奇数时,搜索错误?我看不到问题,所以我写了这个;)@AxelH查找第一个假元素为什么要使用二进制搜索查找第一个假元素?!@Null,因为它比线性探测的速度快…?当所有值==true时,此代码仍有一个错误。您可能需要更新特殊情况下的返回值
    mid==array.length-1
    。如果(low==mid){break;},请更改
    if(low==mid){break;}
    to
    if(low==mid)返回mid
    ,最后返回
    return-(low+1);