二进制搜索中的 While 和退出条件

While and Exit Condition in Binary Search

  1. 关于 while 循环保持搜索 运行 while (low <= high),是否有任何共识,如果使用 '<' 或 '<=' 更好,因为我在网上看到了这两个实例?

  2. 一些二分搜索模板的退出条件不同,因为它们中的一些使用样式 A,只要目标等于我们 return 的中点。另一方面,B 仅在 while 循环退出且 returns nums[low] 后发生。这只是个人喜好问题吗?

一个。 if (target === nums[mid]) return target;

乙。 return nums[low] 退出 while 循环后

while条件的区别来自于high含义的区别:有时是索引after属于最后一个元素到范围,有时它代表最后一个元素本身的索引。对于使用 high 的哪个定义没有达成共识。

但是,您可以根据您使用的语言环境中范围的通常表示方式调整此选择。例如,在 Python、range(a, b) 中排除 b,在 JavaScript arr.slice(a, b) 中排除 b 也是。因此,在这些语言中,我会寻求 high 的定义,将其排除在范围之外,因此您的 while 条件将是 <。在 VBA 中有 LBoundUBound,这表明 high 包容性 定义,因此 while条件将是 <=.

无论哪种方式,while 条件都应该反映出当前范围是非空的。

在循环中加入这一行

if (target === nums[mid]) return target;

...另当别论。

首先,你不会 return target,因为这并不能真正帮助调用者(他们已经知道 target 的值,因为他们提供了它) . return 找到值的索引更合适,以便调用者可以对该索引进行操作:

if (target === nums[mid]) return mid;

出于同样的原因,替代代码可以:

return low;

一方面,第一个代码变体提供了提前退出循环的可能性。在极端情况下,我们甚至可能很幸运,并在 while 循环的第一次迭代中找到匹配项,从而节省了 10 次无用的迭代,否则您仍然会使用不包含此代码的替代代码进行这些操作if。这似乎是件好事。

但是,从统计上看,如果列表中的值 ,您将有 50% 的变化,只能在最后一次可能的迭代中找到它(当范围是只有 1 宽)。如果列表中的值是而不是,您肯定必须执行所有迭代。因此,让每次迭代尽可能 little 是有意义的。这就是 if 语句 包含在 循环中,但只在循环后执行一次的原因。

要选择最适合您案例的策略,同时实施它们,并根据实际数据和搜索进行基准比较。