Java firstPosition算法

|
int firstPosition(int x, int [] a) {

    int lower = 0;
    int upper = a.length;

    while (lower != upper) {
    int mid = (lower + upper) / 2;

    **if (x <= a[mid]) {** // the line I don\'t understand
    upper = mid;
    } else {
    lower = mid + 1;
    }
    return (lower);
}
如果a = {4、4、5、5、6、7、8、9、9、9},那么对于以下x选择,算法将返回什么? i)x = 3 ii)x = 4 iii)x = 5 iv)x = 9 v)x = 11 我尝试逐步执行此程序,例如x = 3,a.length返回10,因此upper始终等于10。
while ( 3 ! = 0 ) { // execute line

int mid = lower + upper / 2 - which is (0 + 10)/2 = 5

if ( x <= a[mid]) // I assume that means if 3 is less than or equal to 5? 5 then replace mid with 5 and then...

lower = mid + 1 // 5+1 = 6, return 6 as lower?
    
已邀请:
        这是一种基本的二进制搜索算法,它是迭代而不是递归实现的。 您不理解的行将检查
x
(搜索值)是否可能位于数组的下半部或上半部。这是可行的,因为对数组进行了排序。我们可以将任何排序后的数组分为两半,然后查看中间的值以确定所寻找值的一半。 说数组看起来像这样:
+---+---+---+---+---+----+
| 1 | 3 | 5 | 7 | 9 | 11 |
+---+---+---+---+---+----+
  ^                        ^
  |                        |
lower                    upper
并且我们试图找出数字
9
位于哪个插槽中。由于对数组进行了排序,因此我们可以立即丢弃该数组的一半。 怎么样? 看一下数组“中心”中的值:它是
5
,而
9
大于
5
,因此我们知道
9
必须在数组的上半部分。从算法上讲,这就是代码中
if
语句的
else
情况。 因此,我们重复相同的过程,但是这次仅查看数组的上半部分:
+---+---+---+---+---+----+
| 1 | 3 | 5 | 7 | 9 | 11 |
+---+---+---+---+---+----+
              ^            ^
              |            |
            lower        upper
    
        在我看来,这就像一个二进制搜索算法。 x的选择可确保每次迭代将需要搜索的数组部分减半。在这里了解更多     
        这是对二进制搜索的修改。 由于数据是有序的,因此要确定是否可以丢弃数据范围的“上”或“下”一半,请查看中间元素。当它大于要查找的数字时,您可以放心地丢弃数字(通过减小范围)。当它小于您要查找的数字时,可以放心地丢弃数字(减小范围)。 这里的关键是,如果它是您要查找的数字,则需要向后爬行到范围的开头,直到您检测到“下一个”数字实际上不是该重复数字的“第一个”值。     

要回复问题请先登录注册