我怎样才能使这个二进制搜索代码更有效?

Posted

技术标签:

【中文标题】我怎样才能使这个二进制搜索代码更有效?【英文标题】: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 是什么? 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于我怎样才能使这个二进制搜索代码更有效?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能使这个 WHERE NOT EXISTS 查询更有效

Facebook iOS SDK - 我怎样才能使页面赞按钮有效?

我怎样才能使这个 web3 python 脚本更快?

搜索列表的更快方法?

搜索排序的链表时,二进制或顺序/线性搜索是不是更有效?

断点被划掉了,我怎样才能使它们有效?