什么是懒惰二进制搜索?

时间:2011-05-11 03:07:03

标签: binary-search lazy-evaluation

我不知道“懒惰”二进制搜索这个术语是否有效,但我正在阅读一些旧资料,我只是想知道是否有人可以解释懒惰二进制搜索的算法并将其与非二进制搜索进行比较-lazy二进制搜索。

让我们说,我们有这一系列的数字:

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

如何使用延迟二进制搜索查找数字11

2 个答案:

答案 0 :(得分:12)

贾斯汀错了。 常见的binarySearch算法首先检查目标是否等于当前中间条目,然后在需要时进入左半部分或右半部分。 Lazy 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

首先是循环:

left&lt; = right,我们进入第一个while循环。我们通过整数除法计算中间指数(0 + 7)/2=3.5=3,中间= 3. 直接我们检查目标11是否等于中间索引条目,11!= 21,然后我们决定是向左还是向右,我们发现11&lt; 21,应该走了。左侧索引保持不变,右侧索引变为中间索引-1,右侧= 3 - 1 = 2.完成此步骤。

第二次循环:

left&lt; = right,0&lt; = 2,我们进入seond while循环。中间索引重新计算:(0 + 2)/ 2 = 1,mid = 1. 立即我们进行相等性检查,目标11与索引1条目相同,11 == 11。我们找到了这个条目,留下所有左右中间索引(不关心)并打破while循环,返回索引1.

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

首先是循环:

左&lt;对,我们进入第一个while循环。中间索引的计算方法与上面相同= 3. 这次我们不再对常见的二进制搜索进行相等检查,而是与中间索引条目进行比较。并且比较仅检查我们的目标11是否大于中间索引条目,留下它们是否等于或不在while循环之外的结尾。所以我们发现11&lt; 21,右侧索引重置为中间索引,右侧= 3.完成此步骤。

第二次循环:

左&lt;对,0&lt; 3,我们进入第二个while循环。中间索引通过整数除法重新计算为mid =(0 + 3)/ 2 = 1。 我们再次与中间索引条目11进行比较,我们意识到它不会大于中间索引条目。我们属于while循环的else部分,并将右侧索引重置为mid index,right = 1.完成此步骤。

第三次循环:

左&lt;对,0&lt; 1,这次我们必须再次重新进入while循环,因为它仍然满足while条件。中间索引变为(0 + 1)/ 2 = 0,中间= 0.在将目标11与中间索引条目2进行比较后,我们发现它大于它(11> 2),左侧索引被重置为中间+ 1,左侧= 0 + 1 = 1.完成此步骤。

左索引= 1且右索引= 1,左=右,而循环条件不再满足,因此无需重新输入。我们属于下面的if部分。目标11等于左索引条目11,我们找到目标并返回左索引1.

正如你所看到的,lazy binarySearch再做一个while循环步骤,最终实现索引实际为1.这就是“推迟等式检查”这个词在我最初提到的定义中的意思。很明显,懒惰的binarySearch算法在到达程序终止之前比常见的binarySearch做更多的事情。 “懒惰”一词反映在检查目标的时间等于中间索引条目的时间。

然而,懒惰的二元搜索更适合在其他情况下使用,但它不在本案的上下文中。

(算法的推理部分是由我完成的,任何人都希望复制请做信用)

来源:“用Java编写的数据结构”,作者:Sesh Venugopal,Prentice Hall

答案 1 :(得分:-1)

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