这个二进制搜索是如何工作的?
How does this binary search works?
我在书上看到过这个方法,做二分查找,但是怎么试都不明白是怎么回事。谁能给我解释一下它是如何工作的?
这本书的解释没有帮助:
The idea is to make jumps and slow the speed when we get closer to the
target element.
The variables k and b contain the position in the array and the jump
length. If the array contains the element x , the position of x will
be in the variable k after the search. The time complexity of the
algorithm is O (log n ), because the code in the while loop is
performed at most twice for each jump length.
我不明白 k 是如何在数组中迭代的?我们如何确保它不会跳过目标的索引?我尝试使用示例值跟踪此程序的一些运行,但无法弄清楚 k 所遵循的模式以查找目标 x 是否存在于数组中。
int k = 1;
for (int b = n/2; b >= 1; b /= 2) {
while (k+b <= n && t[k+b] <= x) k += b;
}
if (t[k] == x) {} // x was found at index k
注意:我很清楚“通用二分查找算法”(使用开始、中间和结束索引的算法)
b
是您当前位置的跳跃 长度。如您所见,b
从 n/2
开始,每一步除以 2,直到达到 1。
现在,对于每个 b
,请记住 b
在 for 循环的每一步都被除以 2,我们 运行 在 while 循环中添加 b
到我们当前的位置,即 k
。我们将 b
添加到 k
检查 2 个条件:k+b
小于 n
(以确保我们不会越界),以及 t[k+b]
小于我们正在搜索的x
。
这实际上意味着对于每个 b
,我们将 b
添加到 k
直到超过我们正在寻找的值。此时,while 循环中断,我们划分 b
以更慢地接近目标,希望我们不要超过它。
最后的 b
只是一个,确保我们不会错过 x
如果它只是 k
.[=31= 位置之后的下一个元素]
这样看,一辆汽车正朝着一个目标飞驰。刚开始车是最高速度,随着接近目标,逐渐减速,直到到达目标。
与传统二分搜索的不同之处在于,这有点违反直觉,在传统的二分搜索中,我们遍历目标然后返回并再次遍历,并且在每次迭代中我们减少了我们的步骤来回走动。在这个算法中,我们只向前走(永远不会超过目标),但是我们通过划分 b
.
来不断减少步长。
我在书上看到过这个方法,做二分查找,但是怎么试都不明白是怎么回事。谁能给我解释一下它是如何工作的?
这本书的解释没有帮助:
The idea is to make jumps and slow the speed when we get closer to the target element. The variables k and b contain the position in the array and the jump length. If the array contains the element x , the position of x will be in the variable k after the search. The time complexity of the algorithm is O (log n ), because the code in the while loop is performed at most twice for each jump length.
我不明白 k 是如何在数组中迭代的?我们如何确保它不会跳过目标的索引?我尝试使用示例值跟踪此程序的一些运行,但无法弄清楚 k 所遵循的模式以查找目标 x 是否存在于数组中。
int k = 1;
for (int b = n/2; b >= 1; b /= 2) {
while (k+b <= n && t[k+b] <= x) k += b;
}
if (t[k] == x) {} // x was found at index k
注意:我很清楚“通用二分查找算法”(使用开始、中间和结束索引的算法)
b
是您当前位置的跳跃 长度。如您所见,b
从 n/2
开始,每一步除以 2,直到达到 1。
现在,对于每个 b
,请记住 b
在 for 循环的每一步都被除以 2,我们 运行 在 while 循环中添加 b
到我们当前的位置,即 k
。我们将 b
添加到 k
检查 2 个条件:k+b
小于 n
(以确保我们不会越界),以及 t[k+b]
小于我们正在搜索的x
。
这实际上意味着对于每个 b
,我们将 b
添加到 k
直到超过我们正在寻找的值。此时,while 循环中断,我们划分 b
以更慢地接近目标,希望我们不要超过它。
最后的 b
只是一个,确保我们不会错过 x
如果它只是 k
.[=31= 位置之后的下一个元素]
这样看,一辆汽车正朝着一个目标飞驰。刚开始车是最高速度,随着接近目标,逐渐减速,直到到达目标。
与传统二分搜索的不同之处在于,这有点违反直觉,在传统的二分搜索中,我们遍历目标然后返回并再次遍历,并且在每次迭代中我们减少了我们的步骤来回走动。在这个算法中,我们只向前走(永远不会超过目标),但是我们通过划分 b
.