在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?是否有任何角落的情况只会有效?
答案 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
对空数组进行检查可能会访问超出范围的索引,从而调用未定义的行为。