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

Binary search in an array with boolean values

我有一个布尔值数组。但是像这样的元素序列: 首先是 true 个值,然后是 false 个值。 例如,

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

所以现在我们有一个带有布尔值的排序数组,如果存在 true 个值,则从 true 个值开始。

任务是找到第一个 false 元素。
我创建了一个 class with search method using binary search algorithm.

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);
    }
}

它工作不正常,即有时它会返回搜索到的元素的前一个元素。
通过迭代搜索来查找元素也不是一个好主意,因为数组的大小可能非常大,而且会花费很多时间。

编辑: 实际上我需要在 MySQL 数据库 table 中搜索。但是table尺寸太大,查找需要的行需要很多时间,我想用二分查找算法来固定。

编辑: MySQL table 大小超过 4500 万行。通过SQL 查询查找需要的行大约需要30 秒,无论我是否为该列添加索引。此外,在 boolean 中添加索引不会产生任何效果。
当我使用二进制搜索时,大约需要 10 毫秒。所以想把上面的方法改过来
编辑: 例如,我有一个名为 "INFORMATION" 的数据库 table。它有两列 "INFO" (TEXT) 和 "CHECKED" (BOOLEAN)。 "INFO" 的初始值为 false。我将首先获取未检查的信息,并从未检查的开始获取 N 行,然后我将检查它们并标记它们 true。将重复此过程,直到没有未检查的信息为止。

在循环中,如果 booleanValue 为 false

  1. 如果低=中,起点和终点相遇,我们找到了我们需要的东西
  2. 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;
        }
    }

我修改了Xin Huang答案并简化了代码:

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;
}

所以现在,如果找到元素,该方法返回数组中第一个 false 元素的索引,如果找不到元素,则返回负值。