Java第一位置算法 intfirstposition(intx,int[]a){ 整数下限=0; int上限=a.长度; while(下部!=上部){ int mid=(下+上)/2; **if(x
在我看来像一个二进制搜索算法。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>代码>(搜索值)可能位于数组的下半部或上半部。这是因为数组被排序。我们可以将任何排序的数组分成两半,并查看中间值来确定我们所寻找的值的一半。
假设数组如下所示:
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