【发布时间】:2012-08-04 00:36:19
【问题描述】:
最近我在一次采访中被问到这个问题。 在二分查找中,我们有两个比较,一个是大于,另一个是小于中间值。能否以某种方式对其进行优化,以便我们只需要检查一次?
【问题讨论】:
标签: optimization binary-search
最近我在一次采访中被问到这个问题。 在二分查找中,我们有两个比较,一个是大于,另一个是小于中间值。能否以某种方式对其进行优化,以便我们只需要检查一次?
【问题讨论】:
标签: optimization binary-search
是的,在几个方面。
通过进行三向比较,这在某些版本的 Fortran 中存在(参见“算术 IF”)。
通过玩弄措辞 - 在 x86(和其他)程序集中,您可以使用一个 cmp,但仍然使用两个分支。
通过使用Deferred Detection of Equality 技巧。
【讨论】:
不,你不能。虽然您可以切换运算符(例如,而不是更大和更少使用更大和相等),但您最终会得到两个比较。在二分查找中,你实际上有三个结果,如果你比较其中两个结果都不是真的,那只能是第三个。
例如:
if (lookup < mid)
searchLower();
else if (lookup > mid)
searchUpper();
else
found(lookup);
如果你切换运算符,牵涉的运算符会改变,但你总是需要两个比较。
【讨论】: