这个二进制搜索是如何工作的?

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 是您当前位置的跳跃 长度。如您所见,bn/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.

来不断减少步长。