【问题标题】:Binary Search won't operate correctly二进制搜索将无法正确运行
【发布时间】:2015-07-06 01:48:26
【问题描述】:

我正在为我的动态数组类编写多重搜索算法,并尝试实现二进制搜索,但我的程序不会正确设置整数 mid 的值。

这是该方法的代码:

public static boolean search(int[] array, int value) {
    int first = 0, last = array.length - 1, mid = ((first + last) / array.length);
    System.out.println(first + " - " + mid + " - " + last);
    while(true) {
        System.out.println(first + " - " + mid + " - " + last);
        if (value == array[mid]) {return true;}
        if (first == last || mid == last || mid == first) {return false;}

        if (value > array[mid]) {
            first = mid;
            mid = (first + last) / (last + 1);
        }
        if (value < array[mid]) {
            last = mid;
            mid = (first + last) / (last + 1);
        }
        System.out.println(first + " - " + mid + " - " + last);
    }
}

我运行该程序进行了数百次测试,但是 mid 的值始终为 0(输出为 0 - 0 - 1117250 - 0 - 1270 - 0 - 15)。 非常感谢所有帮助!

【问题讨论】:

  • 你能发一个minimal but complete program吗?这对您来说不应该付出更多的努力,但这将使我们能够简单地复制粘贴代码并运行它。
  • 你试过调试你的程序吗?我怀疑您很快就能查明问题出在哪里。
  • @sstan 好了,我添加的只是方法足迹。
  • @TimBiegeleisen 我试过了,但它表明我的 mid 分配有问题

标签: java search binary-search


【解决方案1】:

不应该:

mid = ((first + last) / array.length)

...实际上是这样的

mid = ((first + last) / 2)

... 而是让您获得mid?

要获得两个值的中间值,您需要将两个值相加并除以 2

【讨论】:

    【解决方案2】:

    确保您的数组是升序顺序:

    public static boolean search(int[] array, int value) {
        int first = 0, last = array.length - 1, mid = ((first + last) / 2); //Divide by 2
        System.out.println(first + " - " + mid + " - " + last);
        while(true) {
            System.out.println(first + " - " + mid + " - " + last);
            if (value == array[mid]) {return true;}
            if (first == last || mid == last || mid == first) {return false;}
    
            if (value > array[mid]) {
                first = mid;
                mid = (last + first) / 2; //Divide by 2
            }
            if (value < array[mid]) {
                last = mid;
                mid = (first + last) / 2; //Divide by 2
            }
            System.out.println(first + " - " + mid + " - " + last);
        }
    }
    

    【讨论】:

    • 您的意思是“升序”,而不是“小端”顺序。 “Little-endian”或“big-endian”特指组成整数(或其他值)的字节出现的顺序; big-endian 表示高位字节在前,低位字节在后,little-endian 是相反的顺序。不要将这些术语用于其他任何事情——这会让人感到困惑。
    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多