【发布时间】:2012-04-25 15:42:25
【问题描述】:
在Binary Search 的WikiPedia 文章中有一个名为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 更好
我应该在高级语言中考虑到这种差异吗?我管理“延迟”版本的代码似乎更严格,但是您如何形成 if-else 语句有优化或惩罚吗?
【问题讨论】:
-
我猜你的消息来源是在谈论汇编而不是 Java,在这种情况下我认为它不适用。另外,我敢打赌,它没有考虑到现代代码优化。
-
另外,我希望这是一个学术问题,因为如果您根据这种性能评估做出编程决策,那么它就是过早优化的定义。
-
你没有展示其他选择,所以不可能知道你在说什么。
-
@Gray:没有教科书,维基百科。这不是一个编程决定。只是在我的业余时间回顾一下基础
-
@HotLicks:另一种选择是众所周知的
if(a[mid] == key){}else if (a[mid] < key) else{}
标签: java algorithm optimization assembly compilation