二进制搜索中的 While 和退出条件
While and Exit Condition in Binary Search
关于 while 循环保持搜索 运行 while (low <= high)
,是否有任何共识,如果使用 '<' 或 '<=' 更好,因为我在网上看到了这两个实例?
一些二分搜索模板的退出条件不同,因为它们中的一些使用样式 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 中有 LBound
和 UBound
,这表明 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
语句 包含在 循环中,但只在循环后执行一次的原因。
要选择最适合您案例的策略,同时实施它们,并根据实际数据和搜索进行基准比较。
关于 while 循环保持搜索 运行
while (low <= high)
,是否有任何共识,如果使用 '<' 或 '<=' 更好,因为我在网上看到了这两个实例?一些二分搜索模板的退出条件不同,因为它们中的一些使用样式 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 中有 LBound
和 UBound
,这表明 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
语句 包含在 循环中,但只在循环后执行一次的原因。
要选择最适合您案例的策略,同时实施它们,并根据实际数据和搜索进行基准比较。