珍珠编程:第9.3列二进制搜​​索 - 范围初始化

时间:2015-06-20 11:34:29

标签: algorithm binary-search programming-pearls

在9.3节中,Job Bentley提出了一个修改过的二进制搜索..

简要介绍了典型实施方案以及9.3中所示的更好方法

if (arr[mid] < key) low = mid+1
else if (arr[mid] > key) high = mid-1
else return mid;

与不同的不变量进行修改/有效比较..

if (arr[mid] < key) low = m;
else high = m;

在循环外部,检查索引处的键是否为“高”。在修改后的二进制搜索中,左侧索引“低”&#39;从-1开始(而不是0)和&#39;高&#39; index从n开始(而不是n-1)..并且循环运行

while (low + 1 != high)

即使我设置了low = 0和high = n-1,这个修改过的搜索似乎也能正常工作。

但我宁愿不再在他的代码中猜测Job Bentley。那么为什么他将低位设为-1而高位设为n?是否有任何角落的情况只会有效?

1 个答案:

答案 0 :(得分:2)

如果您的数组为空(n == 0),那么while(low + 1 != high的检查只会在low开始于-1且{{1}时正确终止在high

0

如果while((-1 + 1) != 0) //true开始于low,或0开始于high(或两者),则循环将至少执行一次检查:

  • -1
  • while((0 + 1) != 0) // false
  • while((-1 + 1) != -1) // false

对空数组进行检查可能会访问超出范围的索引,从而调用未定义的行为。