【发布时间】:2023-03-27 18:50:02
【问题描述】:
我在一本书中看到了这种方法,用于进行二分搜索,但无论我如何尝试,我都无法理解它是如何工作的。有人可以向我解释一下它是如何工作的吗?
这本书的解释没有帮助:
我们的想法是在我们接近目标时进行跳跃并减慢速度 目标元素。 变量 k 和 b 包含数组中的位置和跳转 长度。如果数组包含元素 x ,则 x 的位置将 搜索后在变量k中。时间复杂度 算法是 O (log n ),因为 while 循环中的代码是 每个跳跃长度最多执行两次。
我不明白的是 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
注意:我确实清楚地了解“常见的二进制搜索算法”(使用开始、中间和结束索引的算法)
【问题讨论】:
-
尝试使用打印语句对其进行注释 - 例如,在每个步骤中打印 k、b、t[k] 和 t[k+b]。看看你预定义的几个不同的数组 [t] 会发生什么(即,知道每个元素中有什么)。如果您仍有疑问,请向我们展示您尝试做些什么来理解它;在堆栈溢出时,如果您向我们展示您首先尝试了某些东西,我们会更喜欢您的问题。
-
@davidbak 谢谢,我会更新问题,具体说一下我不明白的内容
标签: java c++ algorithm binary-search