【问题标题】:How can I make this binary search code more efficient?我怎样才能使这个二进制搜索代码更有效?
【发布时间】:2022-01-11 07:00:40
【问题描述】:
public class MySearch {

    public static int search(MyArray array, int value) {

        int index = -1;

        int start = 0, end = array.length - 1;

        while(start <= end) {

            int mid = (start + end) / 2;

            if(array.compToValue(mid, value) == 1) end = mid - 1;
            else if(array.compToValue(mid, value) == -1) start = mid + 1;
            else return mid;
        }

        return index;

    }
}

如您在屏幕截图中所见,在某些情况下,比较次数会超出。我不允许使用读取操作(get)。我可以进行的比较次数是 O(logn)。

【问题讨论】:

  • array.compToValue(mid, value)提取到一个变量中,在if子句中使用这个变量,而不是计算两次。
  • 关于代码的注释:尽管可能,我们不应该跳过单行 if-、else-、@987654329 周围的大括号({}) @-。 ... 身体。这可能会导致严重的错误。
  • 感谢您的回答,成功了!我也会注意括号。
  • MyArray 是什么?

标签: java search binary


【解决方案1】:

您的代码没有说明数组是否有序。如果数组是无序的,则只能进行线性搜索,不可能进行 O(log n) 的搜索操作。

如果数组是有序的,正如Turing85's comment 所说:

array.compToValue(mid, value) 提取到一个变量中,在if 子句中使用这个变量,而不是计算两次值。

还有一个有用的建议是始终使用大括号。如果代码块只有一行,Java 允许删除它,但这样做是一种不好的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多