Java第一位置算法 intfirstposition(intx,int[]a){ 整数下限=0; int上限=a.长度; while(下部!=上部){ int mid=(下+上)/2; **if(x

Java第一位置算法 intfirstposition(intx,int[]a){ 整数下限=0; int上限=a.长度; while(下部!=上部){ int mid=(下+上)/2; **if(x,java,arrays,algorithm,binary-search,Java,Arrays,Algorithm,Binary Search,在我看来像一个二进制搜索算法。x的选择确保需要搜索的数组部分在每次迭代中减半。阅读更多有关它的内容这是一个基本算法,以迭代方式而不是递归方式实现 不理解检查的行,看看 x>代码>(搜索值)可能位于数组的下半部或上半部。这是因为数组被排序。我们可以将任何排序的数组分成两半,并查看中间值来确定我们所寻找的值的一半。 假设数组如下所示: while ( 3 ! = 0 ) { // execute line int mid = lower + upper / 2 - which is (0 + 1

在我看来像一个二进制搜索算法。x的选择确保需要搜索的数组部分在每次迭代中减半。阅读更多有关它的内容

这是一个基本算法,以迭代方式而不是递归方式实现

不理解检查的行,看看<代码> x>代码>(搜索值)可能位于数组的下半部或上半部。这是因为数组被排序。我们可以将任何排序的数组分成两半,并查看中间值来确定我们所寻找的值的一半。


假设数组如下所示:

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?
我们试图找出编号
9
在哪个插槽中。由于数组已排序,我们可以立即丢弃一半数组

怎么做

查看数组“中心”的值:
5
,并且
9
大于
5
,因此我们知道
9
必须位于数组的上半部分。从算法上讲,这就是代码中
if
语句的
else
情况

所以我们重复同样的过程,但这次只看阵列的上半部分:

+---+---+---+---+---+----+
| 1 | 3 | 5 | 7 | 9 | 11 |
+---+---+---+---+---+----+
  ^                        ^
  |                        |
lower                    upper

这是对二进制搜索的修改

由于数据是有序的,要确定是否可以丢弃数据范围的“上”或“下”一半,请查看中间元素。当它大于要查找的数字时,可以安全地丢弃超过它的数字(通过缩小范围)。当它小于您要查找的数字时,您可以安全地丢弃它之前的数字(通过缩小范围)


这里的关键是,如果它是您正在寻找的号码,您需要爬回范围的开始,直到您检测到“下一个”号码实际上不是“第一个”它看起来像是二进制搜索。如果数组的中间元素较大,则它会降低中间值。因此,如果x=3,则降低值是否返回6?
lower
是一个变量,而不是函数/方法,因此它不会“返回”任何东西,是的,因为数组长度等于10,所以
mid
等于5。当3<5时,
lower
变为
mid+1
。因此
lower
变为6循环体作为数组长度的函数执行了多少次?听起来像是家庭作业。@paradom:你注意到“数组”的大小了吗(即,
upper-lower
大约发生了什么)每个循环迭代?这应该给你一个线索。
+---+---+---+---+---+----+
| 1 | 3 | 5 | 7 | 9 | 11 |
+---+---+---+---+---+----+
  ^                        ^
  |                        |
lower                    upper
+---+---+---+---+---+----+
| 1 | 3 | 5 | 7 | 9 | 11 |
+---+---+---+---+---+----+
              ^            ^
              |            |
            lower        upper