【问题标题】:Programming Pearls: Column 9.3 Binary Search - range initialization编程珍珠:第 9.3 列二分搜索 - 范围初始化
【发布时间】:2015-09-06 08:14:23
【问题描述】:

在第 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;

在循环之外,检查索引处的键是否为“高”。在修改后的二分搜索中,左索引“low”从-1(而不是0)开始,“high”索引从n(而不是n-1)开始。循环运行

while (low + 1 != high)

即使我设置 low = 0 和 high = n-1,这个修改后的搜索似乎也有效。

但我宁愿不要在他的代码中猜测 Job Bentley。那么他为什么将 low 设置为 -1 而 high 设置为 n 呢?是否有任何极端情况只能这样工作?

【问题讨论】:

  • 0 或 1 个元素的数组
  • 谢谢。如果你把它作为一个答案,我会接受。
  • 完成了。我只解决了空数组的情况。随意按照我的方法探索一个元素案例。
  • 可以展示整个优化的二分搜索代码,让问题更清晰。@Manohar

标签: algorithm binary-search programming-pearls


【解决方案1】:

如果您有一个空数组 (n == 0),那么只有在 low 开始于 -1high 开始于 0 时,对 while(low + 1 != high) 的检查才会正确终止。

while((-1 + 1) != 0) //true

如果low0 开始,或high-1 开始(或两者兼而有之),那么循环显然会执行至少一项检查:

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

对空数组的检查可能会访问越界索引,这会调用未定义的行为。

【讨论】:

  • 另一种极端情况是使用 1 元素数组。如果low被初始化为0,high被初始化为n-1 = 0,它将永远循环。
猜你喜欢
  • 2012-08-13
  • 2012-05-03
  • 1970-01-01
  • 2013-06-25
  • 2011-12-08
  • 2015-08-28
  • 2016-11-04
  • 1970-01-01
  • 2015-08-14
相关资源
最近更新 更多