【问题标题】:questions on binary search in Programming Pearls, 2nd EditionProgramming Pearls,第 2 版中关于二分搜索的问题
【发布时间】:2012-05-18 20:03:48
【问题描述】:

我正在阅读 Jon Bentley 的 Programming Pearls,第 2 版的第 9.3 节。

在第 94 页,Jon 给出了改进的二分搜索算法的实现,利用 n 是 1000 的事实(搜索 1000 个数字以找到目标)。

程序结束时是:

if p > 1000 || x[p] != t
    p = -1

我的问题是,如果 p 正好是 1000 怎么办?好像当 p 为 1000 时,它也应该报错,比如:

if p >= 1000 || x[p] != t
    p = -1

无论如何,这部分代码是从第93页的代码翻译过来的,在wich的末尾:

if p >= n || x[p] != t
    p = -1

我的理解正确吗?我只是想知道这是否是一个错字,或者真的没有必要在条件中包含 case p is 1000。

另一个问题是,在第 94 页自下而上的第 5~6 行中,它说:当第一次测试失败并且 l 保持为零时,程序按顺序计算 p 的位,最高有效位在前。

这里是什么意思?而当第一次测试失败时,我不应该是-1,而不是0?

谁能详细说明这个说法?

附:我找不到 Jon 的电子邮件地址,否则,我会将这些问题发给他。 :-(

【问题讨论】:

  • 我手边没有这本书,但我似乎记得他的算法是用基于 1 的数组而不是许多编程语言中常见的基于 0 的数组编写的。在这种情况下,x[1000] 将是数组中的最后一个有效值。
  • @AdrianMcCarthy:看起来不像。在第 93 页,作者已经说明数组是 x[0..n-1]。这里的代码只是处理 n 为 1000 的情况。这里有点困惑......

标签: algorithm


【解决方案1】:

这是错别字。 l 的最大值是 999 (1000 - 512 + 256 + .. + 1, ),所以 p = l+1 的最大值是 1000。对于 binsearch 的硬编码版本(清单 9.8)很清楚。

我们可以看到真正的 C 代码(不是伪代码)here (Alg.4)if (p >= n ||

【讨论】:

  • 我怀疑这是一个错字。我在论坛上提出这个问题是因为我没有在本书主页的勘误表中看到这个条目。谢谢!
猜你喜欢
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多