【问题标题】:What is Lazy Binary Search?什么是惰性二分搜索?
【发布时间】:2011-08-22 23:03:36
【问题描述】:

我不知道“懒惰”二分搜索这个术语是否有效,但我正在浏览一些旧资料,我只是想知道是否有人可以解释懒惰二分搜索的算法并将其与非-lazy 二分查找。

假设我们有这个数字数组:

2, 11, 13, 21, 44, 50, 69, 88

如何使用惰性二分搜索查找号码11

【问题讨论】:

  • 你能告诉我们你正在经历哪些“旧材料”吗?

标签: binary-search lazy-evaluation


【解决方案1】:

贾斯汀错了。 常见的 binarySearch 算法首先检查目标是否等于当前中间条目,然后根据需要继续进行左半部分或右半部分。惰性二元搜索算法将相等性检查推迟到最后。

algorithm lazyBinarySearch(array, n, target)
left<-0
right<-n-1
while (left<right) do
    mid<-(left+right)/2
    if(target>array[mid])then
        left<-mid+1
    else
        right<-mid
    endif
endwhile

if(target==array[left])then
    display "found at position", left
else
    display "not found"
endif

在你的情况下,在一个数组中,

2 11 13 21 44 50 69 88

你想搜索 11

首先我们做一个常见的二分查找,

index 0     1  2  3   4  5  6  7
      2     11 13 21  44 50 69 88
      left        mid          right

第一个while循环:

left 立即我们检查目标 11 是否等于中间索引条目,11 != 21,然后我们决定是向左还是向右,我们发现11

第二个while循环:

left 立即我们进行相等性检查,目标 11 与索引 1 条目相同,11 == 11。我们找到了这个条目,留下了所有左右中间的索引(不关心)并打破了 while 循环,返回索引 1。

现在我们通过惰性 binazySearch 算法跟踪这个搜索,初始数组的左/右索引设置与之前相同。

第一个while循环:

left 这次我们不是在 common binarySearch 中进行相等性检查,而是与 mid index 条目进行比较。并且比较只检查我们的目标 11 是否大于中间索引条目,将它们是否相等直到在 while 循环之外。 所以我们发现 11

第二个while循环:

left 我们再次与中间索引条目 11 进行比较,我们意识到它不大于中间索引条目。我们陷入了while循环的else部分,将右索引重置为中间索引,右=1。完成这一步。

第三个while循环:

left 2),左侧索引重置为中间 + 1,左侧 = 0 + 1 = 1。完成这一步。

left index = 1,right index = 1,left = right,while循环条件不再满足,不需要重新进入。我们落入下面的 if 部分。目标11等于左索引条目11,我们找到目标并返回左索引1。

如您所见,惰性二进制搜索执行了一个 while 循环步骤,最终实现索引实际上是 1。这就是我一开始提到的定义中“推迟相等检查”一词的含义。显然,惰性 binarySearch 算法在程序终止之前比普通的 binarySearch 做了更多的事情。 而“懒惰”一词体现在检查目标是否等于中间索引条目的时间。

然而惰性二元搜索在其他一些情况下更适合使用,但它不在这种情况下。

(算法的推理部分由我完成,任何想复制的人请注明)

来源:Prentice Hall 的 Sesh Venugopal 撰写的“Java 外部数据结构”

【讨论】:

【解决方案2】:

据我所知,“惰性二进制搜索”只是“Binary search”的另一个名称。

【讨论】:

  • 真的吗?好吧,我学到的是最初的二分搜索算法,然后是“惰性”二分搜索。
  • @Hydride 我看不出二进制搜索如何变得“更懒惰”:-) 如果确实存在这样的事情,我本来希望“懒惰”这个词会出现在维基百科的某个地方页面。
  • 是的,我知道,我也在那里搜索过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2014-11-05
相关资源
最近更新 更多