在Binary Search
的{{1}}文章中,有一个名为Deferred detection of equality
的部分,它提供了一个有点“优化”的二进制搜索版本,如下所示:
int binary_search(int A[], int key, int imin, int imax)
{
while (imax > imin)
{
int imid = (imin + imax) / 2;
if (A[imid] < key)
imin = imid + 1;
else
imax = imid;
}
if((imax == imin) && (A[imin] == key))
return imin;
else
return KEY_NOT_FOUND;
}
据称,这是一个比传统教科书二进制搜索更好的版本,因为.... algorithm uses only one conditional branch per iteration
这是真的?我的意思是if
指令已在汇编中的CMP
和Branch
指令中翻译,因此我无法想象if-else
如何优于if-else if-else
>
是否有这样的差异,我应该在更高级别的语言中考虑?我所说的“deffered”版本的代码似乎更紧张,但是你在如何形成if-else
语句时会有优化或惩罚吗?
答案 0 :(得分:3)
关键概念是它每次迭代使用一个较少的条件 。也就是说,等式检查已移到while
循环之外,因此它只运行一次,而在基本版本中,每次都需要检查¹。
那就是说,我不确定在使用优化形式时是否确实存在可衡量的差异。例如,考虑一下:
备注:强>
¹实际上它是另一个条件,当相等比较移出时不需要检查,但概念上没有区别。