我怎样才能使这个二进制搜索代码更有效?
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 查询更有效