【问题标题】:How does this binary search works?这种二分搜索是如何工作的?
【发布时间】: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


【解决方案1】:

b 是您当前位置跳跃的长度。如您所见,bn/2 开头,每一步除以 2,直到达到 1。

现在,对于每个 b,请记住 b 在 for 循环中的每一步除以 2,我们运行一个 while 循环,将 b 添加到当前位置,即 k .我们将b 添加到k 检查两个条件:k+b 小于n(以确保我们不会越界),t[k+b] 小于x,我们正在搜索。

这实际上意味着对于每个b,我们将b 添加到k,直到它超过我们所寻求的价值为止。此时,while 循环中断,我们将b 划分为更慢地接近目标,希望我们不会越过它。

最后的b 只是一个,以确保我们不会错过x,如果它只是k 之后的下一个元素。

这样看,一辆汽车正朝着一个目标疾驰而去。起初汽车以最大速度行驶,当它接近目标时,它会逐渐减速直到到达目标。

与传统的二分搜索的不同之处在于,在传统的二分搜索中,我们会遍历目标,然后返回并再次遍历,并且在每次迭代中,我们会减少返回的步数来回。在这个算法中,我们只前进(从不超过目标),但我们通过除以b 不断减少步长。

【讨论】:

  • 关键的联系是我们将我们的搜索空间除以2,而不仅仅是一个数组。
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 2020-06-23
  • 2019-03-13
  • 2019-10-23
  • 2015-02-09
  • 2018-02-04
  • 2013-06-20
  • 1970-01-01
相关资源
最近更新 更多